Merge remote-tracking branch 'origin/master' into ftdi_basic

This commit is contained in:
LordGrey 2024-05-25 23:35:13 +02:00
commit 49b44089e7
388 changed files with 20045 additions and 12428 deletions

View File

@ -1,71 +0,0 @@
#!/bin/bash
# detect CI
if [ "$HOME" != "" ]; then
# GitHub Actions
echo "Github Actions detected"
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
CI_BUILD_DIR="$GITHUB_WORKSPACE"
else
# for executing in non ci environment
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
fi
# set environment variables if not exists
[ -z "${BUILD_TYPE}" ] && BUILD_TYPE="Debug"
# Determine cmake build type; tag builds are Release, else Debug (-dev appends to platform)
if [[ $BUILD_SOURCEBRANCH == *"refs/tags"* || $GITHUB_REF == *"refs/tags"* ]]; then
BUILD_TYPE=Release
else
PLATFORM=${PLATFORM}-dev
fi
echo "Platform: ${PLATFORM}, build type: ${BUILD_TYPE}, CI_NAME: $CI_NAME, docker image: ${DOCKER_IMAGE}, docker type: ${DOCKER_TAG}"
# Build the package on osx or linux
if [[ "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then
echo "Compile Hyperion on OSX or Darwin"
# compile prepare
mkdir build || exit 1
cd build
cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ../ || exit 2
make -j $(sysctl -n hw.ncpu) package || exit 3
cd ${CI_BUILD_DIR} && source /${CI_BUILD_DIR}/test/testrunner.sh || exit 4
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ $CI_NAME == *"mingw64_nt"* || "$CI_NAME" == 'windows_nt' ]]; then
echo "Compile Hyperion on Windows"
# compile prepare
echo "Number of Cores $NUMBER_OF_PROCESSORS"
mkdir build || exit 1
cd build
cmake -G "Visual Studio 17 2022" -A x64 -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE="Release" ../ || exit 2
cmake --build . --target package --config "Release" -- -nologo -v:m -maxcpucount || exit 3
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ "$CI_NAME" == 'linux' ]]; then
echo "Compile Hyperion with DOCKER_IMAGE = ${DOCKER_IMAGE}, DOCKER_TAG = ${DOCKER_TAG} and friendly name DOCKER_NAME = ${DOCKER_NAME}"
# set GitHub Container Registry url
REGISTRY_URL="ghcr.io/hyperion-project/${DOCKER_IMAGE}"
# take ownership of deploy dir
mkdir ${CI_BUILD_DIR}/deploy
# run docker
docker run --rm \
-v "${CI_BUILD_DIR}/deploy:/deploy" \
-v "${CI_BUILD_DIR}:/source:ro" \
$REGISTRY_URL:$DOCKER_TAG \
/bin/bash -c "mkdir hyperion && cp -r source/. /hyperion &&
cd /hyperion && mkdir build && cd build &&
cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ../ || exit 2 &&
make -j $(nproc) package || exit 3 &&
cp /hyperion/build/bin/h* /deploy/ 2>/dev/null || : &&
cp /hyperion/build/Hyperion-* /deploy/ 2>/dev/null || : &&
cd /hyperion && source /hyperion/test/testrunner.sh || exit 4 &&
exit 0;
exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
# overwrite file owner to current user
sudo chown -fR $(stat -c "%U:%G" ${CI_BUILD_DIR}/deploy) ${CI_BUILD_DIR}/deploy
fi

View File

@ -1,40 +0,0 @@
#!/bin/bash
# detect CI
if [ "$HOME" != "" ]; then
# GitHub Actions
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
CI_BUILD_DIR="$GITHUB_WORKSPACE"
else
# for executing in non ci environment
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
fi
function installAndUpgrade()
{
arr=("$@")
for i in "${arr[@]}";
do
list_output=`brew list --formula | grep $i`
outdated_output=`brew outdated | grep $i`
if [[ ! -z "$list_output" ]]; then
if [[ ! -z "$outdated_output" ]]; then
echo "Outdated package: ${outdated_output}"
brew unlink ${outdated_output}
brew upgrade $i
brew link --overwrite $i
fi
else
brew install $i
fi
done
}
# install osx deps for hyperion compile
if [[ $CI_NAME == 'osx' || $CI_NAME == 'darwin' ]]; then
echo "Install dependencies"
brew update
dependencies=("qt5" "python" "libusb" "cmake" "doxygen", "libftdi")
installAndUpgrade "${dependencies[@]}"
fi

View File

@ -1,76 +0,0 @@
# Hyperion.NG .codedocs Configuration File
#---------------------------------------------------------------------------
# CodeDocs Configuration
#---------------------------------------------------------------------------
# Include the Doxygen configuration from another file.
# The file must be a relative path with respect to the root of the repository.
DOXYFILE =
# Specify external repository to link documentation with.
# This is similar to Doxygen's TAGFILES option, but will automatically link to
# tags of other repositories already using CodeDocs. List each repository to
# link with by giving its location in the form of owner/repository.
# For example:
# TAGLINKS = doxygen/doxygen CodeDocs/osg
# Note: these repositories must already be built on CodeDocs.
TAGLINKS =
#---------------------------------------------------------------------------
# Doxygen Configuration
#---------------------------------------------------------------------------
# Doxygen configuration may also be placed in this file.
# Currently, the following Doxygen configuration options are available. Refer
# to http://doxygen.org/manual/config.html for detailed explanation of the
# options. To request support for more options, contact support@codedocs.xyz.
#
# ABBREVIATE_BRIEF =
# ALIASES =
# ALPHABETICAL_INDEX =
# ALWAYS_DETAILED_SEC =
# CASE_SENSE_NAMES =
# CLASS_DIAGRAMS =
# DISABLE_INDEX =
# DISTRIBUTE_GROUP_DOC =
# EXAMPLE_PATH =
EXCLUDE = .ci/ \
assets/ \
bin/
config/ \
effects/ \
test/ \
# EXCLUDE_PATTERNS =
# EXCLUDE_SYMBOLS =
# EXTENSION_MAPPING =
# EXTRACT_LOCAL_CLASSES =
# FILE_PATTERNS =
# GENERATE_TAGFILE =
# GENERATE_TREEVIEW =
# HIDE_COMPOUND_REFERENCE =
# HIDE_SCOPE_NAMES =
# HIDE_UNDOC_CLASSES =
# HIDE_UNDOC_MEMBERS =
# HTML_TIMESTAMP =
# INLINE_GROUPED_CLASSES =
# INPUT_ENCODING =
# INTERNAL_DOCS =
# OPTIMIZE_OUTPUT_FOR_C =
PROJECT_BRIEF = "The successor to Hyperion aka Hyperion Next Generation"
PROJECT_NAME = "Hyperion.NG"
# PROJECT_NUMBER =
# SHORT_NAMES =
# SHOW_FILES =
# SHOW_INCLUDE_FILES =
# SHOW_NAMESPACES =
# SORT_BRIEF_DOCS =
# SORT_BY_SCOPE_NAME =
# SORT_MEMBER_DOCS =
# STRICT_PROTO_MATCHING =
# TYPEDEF_HIDES_STRUCT =
USE_MDFILE_AS_MAINPAGE = README.md
# VERBATIM_HEADERS =
#

View File

@ -1,20 +1,25 @@
{
"name": "Hyperion.ng Linux",
"extensions": [
"twxs.cmake",
"ms-vscode.cpptools",
"ms-vscode.cmake-tools",
"spmeesseman.vscode-taskexplorer",
"yzhang.markdown-all-in-one",
"CoenraadS.bracket-pair-colorizer",
"vscode-icons-team.vscode-icons",
"editorconfig.editorconfig"
],
"settings": {
"editor.formatOnSave": false,
"cmake.environment": {
},
},
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
"extensions": [
"twxs.cmake",
"ms-vscode.cpptools",
"ms-vscode.cmake-tools",
"spmeesseman.vscode-taskexplorer",
"yzhang.markdown-all-in-one",
"CoenraadS.bracket-pair-colorizer",
"vscode-icons-team.vscode-icons",
"editorconfig.editorconfig",
"RVSmartPorting.rpm-spec-ext"
],
"settings": {
"editor.formatOnSave": false,
"cmake.environment": { }
}
}
},
"forwardPorts": [8090, 8092],
"postCreateCommand": "git submodule update --recursive --init && sudo apt-get update && sudo apt-get install -y git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libjpeg-dev libturbojpeg0-dev libssl-dev"
"postCreateCommand": "git submodule update --recursive --init && sudo apt-get update && sudo apt-get install -y git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libjpeg-dev libturbojpeg0-dev libssl-dev libasound2-dev"
}

57
.github/scripts/build.sh vendored Executable file
View File

@ -0,0 +1,57 @@
#!/bin/bash
# set environment variables if not exists
[ -z "${BUILD_TYPE}" ] && BUILD_TYPE="Debug"
[ -z "${TARGET_ARCH}" ] && TARGET_ARCH="linux/amd64"
[ -z "${PLATFORM}" ] && PLATFORM="x11"
# Determine cmake build type; tag builds are Release, else Debug (-dev appends to platform)
if [[ $GITHUB_REF == *"refs/tags"* ]]; then
BUILD_TYPE=Release
else
PLATFORM=${PLATFORM}-dev
fi
echo "Compile Hyperion on '${RUNNER_OS}' with build type '${BUILD_TYPE}' and platform '${PLATFORM}'"
# Build the package on MacOS, Windows or Linux
if [[ "$RUNNER_OS" == 'macOS' ]]; then
mkdir build || exit 1
cmake -B build -G Ninja -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=/usr/local || exit 2
cmake --build build --target package --parallel $(sysctl -n hw.ncpu) || exit 3
cd ${GITHUB_WORKSPACE} && source /${GITHUB_WORKSPACE}/test/testrunner.sh || exit 4
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ $RUNNER_OS == "Windows" ]]; then
echo "Number of Cores $NUMBER_OF_PROCESSORS"
mkdir build || exit 1
cd build
cmake -G "Visual Studio 17 2022" -A x64 -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE="Release" ../ || exit 2
cmake --build . --target package --config "Release" -- -nologo -v:m -maxcpucount || exit 3
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ "$RUNNER_OS" == 'Linux' ]]; then
echo "Docker arguments used: DOCKER_IMAGE=${DOCKER_IMAGE}, DOCKER_TAG=${DOCKER_TAG}, TARGET_ARCH=${TARGET_ARCH}"
# verification bypass of external dependencies
# set GitHub Container Registry url
REGISTRY_URL="ghcr.io/hyperion-project/${DOCKER_IMAGE}"
# take ownership of deploy dir
mkdir ${GITHUB_WORKSPACE}/deploy
# run docker
docker run --rm --platform=${TARGET_ARCH} \
-v "${GITHUB_WORKSPACE}/deploy:/deploy" \
-v "${GITHUB_WORKSPACE}:/source:rw" \
$REGISTRY_URL:$DOCKER_TAG \
/bin/bash -c "mkdir -p /source/build && cd /source/build &&
cmake -G Ninja -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} .. || exit 2 &&
cmake --build . --target package -- -j $(nproc) || exit 3 || : &&
cp /source/build/bin/h* /deploy/ 2>/dev/null || : &&
cp /source/build/Hyperion-* /deploy/ 2>/dev/null || : &&
cd /source && source /source/test/testrunner.sh || exit 5 &&
exit 0;
exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
# overwrite file owner to current user
sudo chown -fR $(stat -c "%U:%G" ${GITHUB_WORKSPACE}/deploy) ${GITHUB_WORKSPACE}/deploy
fi

View File

@ -1,131 +0,0 @@
name: Hyperion APT Build
on:
workflow_call:
secrets:
APT_GPG:
required: true
APT_USER:
required: true
APT_PASSWORD:
required: true
APT_DRAFT:
required: true
jobs:
setup:
name: Setup APT build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set APT matrix
id: apt-ppa
run: |
APT=$(jq -n '.include |= [ inputs[] | select(.["exclude"] != true)]' .github/workflows/apt/*.json --compact-output)
echo "apt=$APT" >> $GITHUB_OUTPUT
outputs:
apt-matrix: ${{ steps.apt-ppa.outputs.apt }}
build:
name: ${{ matrix.description }}
needs: [setup]
runs-on: ubuntu-latest
strategy:
matrix: ${{ fromJson(needs.setup.outputs.apt-matrix) }}
steps:
- uses: actions/checkout@v3
with:
submodules: true
- name: Generate environment variables
run: |
tr -d '\n' < .version > temp && mv temp .version
VERSION=$(cat .version)
echo VERSION=${VERSION} >> $GITHUB_ENV
if [[ $VERSION == *"-"* ]]; then
echo STANDARDS_VERSION=$(echo ${VERSION%-*}) >> $GITHUB_ENV
echo TARBALL_VERSION=$(echo ${VERSION%-*}) >> $GITHUB_ENV
echo DEBIAN_FORMAT='3.0 (quilt)' >> $GITHUB_ENV
else
echo STANDARDS_VERSION=$(echo ${VERSION%+*}) >> $GITHUB_ENV
echo TARBALL_VERSION=${VERSION}~$(echo ${{ matrix.distribution }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV
echo DEBIAN_FORMAT='3.0 (native)' >> $GITHUB_ENV
fi
echo DISTRIBUTION=$(echo ${{ matrix.distribution }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV
- name: Build package
shell: bash
run: |
mkdir -p "${GITHUB_WORKSPACE}/deploy"
docker run --rm \
-v "${GITHUB_WORKSPACE}/deploy:/deploy" \
-v "${GITHUB_WORKSPACE}:/source:rw" \
ghcr.io/hyperion-project/${{ matrix.architecture }}:${{ env.DISTRIBUTION }} \
/bin/bash -c "cd /source && \
mkdir -p debian/source && echo '${{ env.DEBIAN_FORMAT }}' > debian/source/format && \
dch --create --distribution ${{ env.DISTRIBUTION }} --package 'hyperion' -v '${{ env.VERSION }}~${{ env.DISTRIBUTION }}' '${{ github.event.commits[0].message }}' && \
cp -fr LICENSE debian/copyright && \
sed 's/@BUILD_DEPENDS@/${{ matrix.build-depends }}/g; s/@DEPENDS@/${{ matrix.package-depends }}/g; s/@ARCHITECTURE@/${{ matrix.architecture }}/g; s/@STANDARDS_VERSION@/${{ env.STANDARDS_VERSION }}/g' debian/control.in > debian/control && \
sed 's/@CMAKE_ENVIRONMENT@/${{ matrix.cmake-environment }}/g' debian/rules.in > debian/rules && \
tar -cJf ../hyperion_${{ env.TARBALL_VERSION }}.orig.tar.xz . && \
debuild --no-lintian -uc -us && \
cp ../hyperion_*.deb /deploy"
- name: Upload package artifact
if: startsWith(github.event.ref, 'refs/tags')
uses: actions/upload-artifact@v3
with:
path: deploy
retention-days: 1
publish:
name: Publish APT packages
if: startsWith(github.event.ref, 'refs/tags')
needs: [setup, build]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v5.2.0
with:
gpg_private_key: ${{ secrets.APT_GPG }}
- name: Install reprepro
run: sudo apt -y install reprepro
- name: Make build folders, export public GPG key and copy distributions file
run: |
mkdir -p apt/{conf,dists,db}
gpg --armor --output apt/hyperion.pub.key --export 'admin@hyperion-project.org'
cp debian/distributions apt/conf/distributions
- name: Create initial structure/packages files and symbolic links
run: |
reprepro -Vb apt createsymlinks
reprepro -Vb apt export
- name: Download artifacts
uses: actions/download-artifact@v3.0.2
- name: Include artifacts into the package source
run: |
for file in artifact/hyperion_*.deb; do
if [ -f "$file" ]; then
dist=${file#*~}
dist=${dist%_*}
reprepro -Vb apt/ includedeb "$dist" "$file"
fi
done
- name: Upload packages to APT server (DRAFT)
uses: SamKirkland/FTP-Deploy-Action@4.3.3
with:
server: apt.hyperion-project.org
username: ${{ secrets.APT_USER }}
password: ${{ secrets.APT_PASSWORD }}
local-dir: "./apt/"
server-dir: ${{ secrets.APT_DRAFT }}
dangerous-clean-slate: true

View File

@ -1,66 +0,0 @@
[
{
"distribution": "Bionic",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl1.0-dev, libmbedtls-dev",
"package-depends": "libpython3.6, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls10, libasound2, libturbojpeg, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 18.04 (Bionic Beaver) (amd64)"
},
{
"distribution": "Focal",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.8, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 20.04 (Focal Fossa) (amd64)"
},
{
"distribution": "Jammy",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.04 (Jammy Jellyfish) (amd64)"
},
{
"distribution": "Kinetic",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.10 (Kinetic Kudu) (amd64)"
},
{
"distribution": "Stretch",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl1.0-dev, libmbedtls-dev",
"package-depends": "libpython3.5, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls10, libasound2, libturbojpeg0, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 9.x (Stretch) (amd64)"
},
{
"distribution": "Buster",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.7, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg0, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 10.x (Buster) (amd64)"
},
{
"distribution": "Bullseye",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.9, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 11.x (Bullseye) (amd64)"
},
{
"distribution": "Bookworm",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 12.x (Bookworm) (amd64)"
}
]

View File

@ -1,59 +0,0 @@
[
{
"distribution": "Bionic",
"architecture": "arm64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libturbojpeg0-dev, libjpeg-dev, libssl1.0-dev, libmbedtls-dev",
"package-depends": "libpython3.6, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls10, libturbojpeg, libcec4",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 18.04 (Bionic Beaver) (arm64)"
},
{
"distribution": "Focal",
"architecture": "arm64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.8, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libturbojpeg, libcec4",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 20.04 (Focal Fossa) (arm64)"
},
{
"distribution": "Jammy",
"architecture": "arm64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libturbojpeg, libcec6",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.04 (Jammy Jellyfish) (arm64)"
},
{
"distribution": "Kinetic",
"architecture": "arm64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libturbojpeg, libcec6",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.10 (Kinetic Kudu) (arm64)"
},
{
"distribution": "Buster",
"architecture": "arm64",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl-dev, libraspberrypi-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.7, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libturbojpeg0, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 10.x (Buster) (arm64)"
},
{
"distribution": "Bullseye",
"architecture": "arm64",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl-dev, libraspberrypi-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.9, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 11.x (Bullseye) (arm64)"
},
{
"distribution": "Bookworm",
"architecture": "arm64",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl-dev, libraspberrypi-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.9, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 12.x (Bookworm) (arm64)",
"exclude" : true
}
]

View File

@ -1,67 +0,0 @@
[
{
"distribution": "Bionic",
"architecture": "armhf",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libturbojpeg0-dev, libjpeg-dev, libssl1.0-dev, libmbedtls-dev",
"package-depends": "libpython3.6, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls10, libturbojpeg, libcec4",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 18.04 (Bionic Beaver) (armhf)"
},
{
"distribution": "Focal",
"architecture": "armhf",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.8, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libturbojpeg, libcec4",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 20.04 (Focal Fossa) (armhf)"
},
{
"distribution": "Jammy",
"architecture": "armhf",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libturbojpeg, libcec6",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.04 (Jammy Jellyfish) (armhf)"
},
{
"distribution": "Kinetic",
"architecture": "armhf",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libturbojpeg, libcec6",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.10 (Kinetic Kudu) (armhf)"
},
{
"distribution": "Stretch",
"architecture": "armhf",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl1.0-dev, libraspberrypi-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.5, libusb-1.0-0, libqt5widgets5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls10, libturbojpeg0, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description":"Debian 9.x (Stretch) (armhf)"
},
{
"distribution": "Buster",
"architecture": "armhf",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl1.0-dev, libraspberrypi-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.7, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libturbojpeg0, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 10.x (Buster) (armhf)"
},
{
"distribution": "Bullseye",
"architecture": "armhf",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl-dev, libraspberrypi-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.9, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 11.x (Bullseye) (armhf)"
},
{
"distribution": "Bookworm",
"architecture": "armhf",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl-dev, libraspberrypi-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.9, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 12.x (Bookworm) (armhf)",
"exclude" : true
}
]

View File

@ -1,4 +1,4 @@
name: Clean artifacts
name: 🧹 Cleanup old artifacts
# Run cleanup workflow at the end of every day
on:
@ -9,7 +9,7 @@ jobs:
clean:
runs-on: ubuntu-latest
steps:
- name: cleanup
- name: 🧹 Cleanup old workflow artifacts
uses: kolpav/purge-artifacts-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,4 +1,8 @@
name: "CodeQL"
name: 📊 CodeQL
run-name: |
${{ github.event_name == 'schedule' && '⏰ Scheduled CodeQL run' || '' }}
${{ github.event_name == 'push' && format('📊 Pushed CodeQL run - {0}', github.event.head_commit.message) || '' }}
${{ github.event_name == 'pull_request' && format('📊 CodeQL run for PR {0} - {1}', github.event.pull_request.number, github.event.pull_request.title) || github.event.head_commit.message }}
on:
push:
@ -10,7 +14,7 @@ on:
jobs:
analyze:
name: Analyze
name: 📊 Analyze
runs-on: ubuntu-latest
permissions:
actions: read
@ -23,35 +27,35 @@ jobs:
language: [ python, javascript, cpp ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Packages (cpp)
- name: 📥 Install Packages (cpp)
if: ${{ matrix.language == 'cpp' }}
run: |
sudo apt-get update
sudo apt-get install --yes git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libasound2-dev libturbojpeg0-dev libjpeg-dev libssl-dev libftdi1-dev
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
- name: 🔁 Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: +security-and-quality
config-file: ./.github/config/codeql.yml
- name: Autobuild
uses: github/codeql-action/autobuild@v2
- name: 👷 Autobuild
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
- name: 🏃 Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
upload: False
output: sarif-results
- name: Filter SARIF
- name: 🆔 Filter SARIF
uses: advanced-security/filter-sarif@v1
with:
patterns: |
@ -63,14 +67,15 @@ jobs:
input: sarif-results/${{ matrix.language }}.sarif
output: sarif-results/${{ matrix.language }}.sarif
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v2
- name: 📦 Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: sarif-results/${{ matrix.language }}.sarif
- name: Upload loc as a Build Artifact
uses: actions/upload-artifact@v3
- name: 📦 Upload loc as a Build Artifact
uses: actions/upload-artifact@v4
with:
name: sarif-results
name: ${{ matrix.language }}.sarif
path: sarif-results
retention-days: 1

View File

@ -1,187 +0,0 @@
name: Nightly build
# Create nightly builds at the end of every day
on:
schedule:
- cron: '0 0 * * *'
repository_dispatch:
types: [hyperion_nightly_push]
jobs:
update:
name: Update Submodule rpi_ws281x
if: github.repository_owner == 'hyperion-project'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
persist-credentials: false
fetch-depth: 0
submodules: recursive
- name: Update Submodule rpi_ws281x
id: update
run: git submodule update --remote --recursive dependencies/external/rpi_ws281x
- name: Check git status
id: status
run: echo "status=$(git status -s)" >> $GITHUB_OUTPUT
- name: Add and commit changes
if: ${{ steps.status.outputs.status }}
run: |
git config --local user.email "20935312+Hyperion-Bot@users.noreply.github.com"
git config --local user.name "Hyperion-Bot"
git config --local diff.ignoreSubmodules dirty
git commit -am "Update submodule rpi_ws281x"
- name: Push changes
if: ${{ steps.status.outputs.status }}
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.HYPERION_BOT_TOKEN }}
branch: ${{ github.ref }}
check:
name: Compare local <-> nightly
needs: [update]
if: github.repository_owner == 'hyperion-project'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Check if commit has changed
id: build-necessary
run: |
if wget --spider "https://nightly.apt.hyperion-project.org/$(git rev-parse --short HEAD)" 2>/dev/null; then
echo "commit-has-changed=false" >> $GITHUB_OUTPUT
else
echo "commit-has-changed=true" >> $GITHUB_OUTPUT
fi
outputs:
build-nightly: ${{ steps.build-necessary.outputs.commit-has-changed }}
setup:
name: Setup nightly build
needs: [check]
if: ${{ needs.check.outputs.build-nightly == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set nightly matrix
id: nightly-ppa
run: |
NIGHTLY=$(jq -n '.include |= [ inputs[] | select(.["exclude"] != true)]' .github/workflows/apt/*.json --compact-output)
echo "nightly=$NIGHTLY" >> $GITHUB_OUTPUT
outputs:
nightly-matrix: ${{ steps.nightly-ppa.outputs.nightly }}
build:
name: ${{ matrix.description }}
needs: [setup]
runs-on: ubuntu-latest
strategy:
matrix: ${{ fromJson(needs.setup.outputs.nightly-matrix) }}
steps:
- uses: actions/checkout@v3
with:
submodules: true
- name: Generate environment variables
run: |
echo "$(tr -d '\n' < .version)+nightly$(date '+%Y%m%d')$(git rev-parse --short HEAD)" > .version
VERSION=$(cat .version)
echo VERSION=${VERSION} >> $GITHUB_ENV
if [[ $VERSION == *"-"* ]]; then
echo STANDARDS_VERSION=$(echo ${VERSION%-*}) >> $GITHUB_ENV
echo TARBALL_VERSION=$(echo ${VERSION%-*}) >> $GITHUB_ENV
echo DEBIAN_FORMAT='3.0 (quilt)' >> $GITHUB_ENV
else
echo STANDARDS_VERSION=$(echo ${VERSION%+*}) >> $GITHUB_ENV
echo TARBALL_VERSION=${VERSION}~$(echo ${{ matrix.distribution }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV
echo DEBIAN_FORMAT='3.0 (native)' >> $GITHUB_ENV
fi
echo DISTRIBUTION=$(echo ${{ matrix.distribution }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV
- name: Build package
shell: bash
run: |
mkdir -p "${GITHUB_WORKSPACE}/deploy"
docker run --rm \
-v "${GITHUB_WORKSPACE}/deploy:/deploy" \
-v "${GITHUB_WORKSPACE}:/source:rw" \
ghcr.io/hyperion-project/${{ matrix.architecture }}:${{ env.DISTRIBUTION }} \
/bin/bash -c "cd /source && \
mkdir -p debian/source && echo '${{ env.DEBIAN_FORMAT }}' > debian/source/format && \
dch --create --distribution ${{ env.DISTRIBUTION }} --package 'hyperion' -v '${{ env.VERSION }}~${{ env.DISTRIBUTION }}' '${{ github.event.commits[0].message }}' && \
cp -fr LICENSE debian/copyright && \
sed 's/@BUILD_DEPENDS@/${{ matrix.build-depends }}/g; s/@DEPENDS@/${{ matrix.package-depends }}/g; s/@ARCHITECTURE@/${{ matrix.architecture }}/g; s/@STANDARDS_VERSION@/${{ env.STANDARDS_VERSION }}/g' debian/control.in > debian/control && \
sed 's/@CMAKE_ENVIRONMENT@/${{ matrix.cmake-environment }}/g' debian/rules.in > debian/rules && \
tar -cJf ../hyperion_${{ env.TARBALL_VERSION }}.orig.tar.xz . && \
debuild --no-lintian -uc -us && \
cp ../hyperion_*.deb /deploy"
- name: Upload package artifact
uses: actions/upload-artifact@v3
with:
path: deploy
retention-days: 1
publish:
name: Publish nightly packages
needs: [setup, build]
if: github.repository_owner == 'hyperion-project'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v5.2.0
with:
gpg_private_key: ${{ secrets.APT_GPG }}
- name: Install reprepro
run: sudo apt -y install reprepro
- name: Make build folders, export public GPG key, copy distributions file and create short sha file for nightly build check
run: |
mkdir -p nightly/{conf,dists,db}
gpg --armor --output nightly/hyperion.pub.key --export 'admin@hyperion-project.org'
cp debian/distributions nightly/conf/distributions
touch "nightly/$(git rev-parse --short HEAD)"
- name: Create initial structure/packages files and symbolic links
run: |
reprepro -Vb nightly createsymlinks
reprepro -Vb nightly export
- name: Download artifacts
uses: actions/download-artifact@v3.0.2
- name: Include artifacts into the package source
run: |
for file in artifact/*.deb; do
if [ -f "$file" ]; then
dist=${file#*~}
dist=${dist%_*}
reprepro -Vb nightly/ includedeb "$dist" "$file"
fi
done
- name: Upload packages to nightly server
uses: SamKirkland/FTP-Deploy-Action@4.3.3
with:
server: nightly.apt.hyperion-project.org
username: ${{ secrets.NIGHTLY_USER }}
password: ${{ secrets.NIGHTLY_PASSWORD }}
local-dir: "./nightly/"
server-dir: "./"
dangerous-clean-slate: true
- name: Remove intermediate artifacts
uses: geekyeggo/delete-artifact@v2
with:
name: artifact
failOnError: false

View File

@ -1,192 +0,0 @@
name: Hyperion PR Build
on:
pull_request:
branches:
- master
jobs:
######################
###### Linux #########
######################
Linux:
name: ${{ matrix.dockerName }}
runs-on: ubuntu-latest
strategy:
matrix:
dockerImage: [ x86_64, armv6l, armv7l, aarch64 ]
include:
- dockerImage: x86_64
dockerName: Debian Stretch (x86_64)
platform: x11
- dockerImage: armv6l
dockerName: Debian Stretch (Raspberry Pi v1 & ZERO)
platform: rpi
- dockerImage: armv7l
dockerName: Debian Stretch (Raspberry Pi 2 & 3)
platform: rpi
- dockerImage: aarch64
dockerName: Debian Stretch (Generic AARCH64)
platform: amlogic
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: true
# Append PR number to .version
- name: Append PR number to version
shell: bash
run: |
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ github.event.pull_request.number }}" >> .version
# Build packages
- name: Build packages
env:
DOCKER_IMAGE: ${{ matrix.dockerImage }}
DOCKER_TAG: stretch
DOCKER_NAME: ${{ matrix.dockerName }}
PLATFORM: ${{ matrix.platform }}
shell: bash
run: ./.ci/ci_build.sh
# Collecting deployable artifacts
- name: Collecting deployable artifacts
shell: bash
run: |
mkdir -p ${{ matrix.dockerImage }}
mv deploy/*.tar.gz ${{ matrix.dockerImage }}
# Upload artifacts
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: ${{ matrix.dockerImage }}
path: ${{ matrix.dockerImage }}
######################
###### macOS #########
######################
macOS:
name: macOS
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: true
# Append PR number to .version
- name: Append PR number to version
shell: bash
run: |
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ github.event.pull_request.number }}" >> .version
# Install dependencies
- name: Install dependencies
shell: bash
run: ./.ci/ci_install.sh
# Build packages
- name: Build packages
env:
PLATFORM: osx
shell: bash
run: ./.ci/ci_build.sh
# Collecting deployable artifacts
- name: Collecting deployable artifacts
shell: bash
run: |
mkdir -p macOS
mv build/*.dmg macOS
# Upload artifacts
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: macOS
path: macOS
######################
###### Windows #######
######################
windows:
name: Windows
runs-on: windows-2022
env:
VCINSTALLDIR: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC'
QT_VERSION: 5.15.2
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: true
# Append PR number to .version
- name: Append PR number to version
shell: bash
run: |
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ github.event.pull_request.number }}" >> .version
- name: Install Qt
uses: jurplel/install-qt-action@v3
with:
version: ${{env.QT_VERSION}}
target: 'desktop'
arch: 'win64_msvc2019_64'
cache: 'true'
cache-key-prefix: 'cache-qt-windows'
- name: Cache Chocolatey downloads
uses: actions/cache@v3
with:
path: C:\Users\runneradmin\AppData\Local\Temp\chocolatey
key: ${{ runner.os }}-chocolatey
# - name: Install Python
# shell: powershell
# run: |
# choco install --no-progress python -y
- name: Install OpenSSL, DirectX SDK
shell: powershell
run: |
choco install --no-progress openssl directx-sdk -y
- name: Install libjpeg-turbo
run: |
Invoke-WebRequest https://netcologne.dl.sourceforge.net/project/libjpeg-turbo/2.0.6/libjpeg-turbo-2.0.6-vc64.exe -OutFile libjpeg-turbo.exe -UserAgent NativeHost
.\libjpeg-turbo /S
- name: Set up x64 build architecture environment
shell: cmd
run: call "${{env.VCINSTALLDIR}}\Auxiliary\Build\vcvars64.bat"
# Build packages
- name: Build packages
env:
PLATFORM: windows
shell: bash
run: ./.ci/ci_build.sh
# Collecting deployable artifacts
- name: Collecting deployable artifacts
shell: bash
run: |
mkdir -p windows
mv build/*.exe windows
# Upload artifacts
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: windows
path: windows

View File

@ -1,202 +0,0 @@
name: Hyperion CI Build
on:
push:
branches:
- '**'
tags:
- '*'
jobs:
###################
###### Linux ######
###################
Linux:
name: ${{ matrix.dockerName }}
runs-on: ubuntu-latest
strategy:
matrix:
dockerImage: [ x86_64, armv6l, armv7l, aarch64 ]
include:
- dockerImage: x86_64
dockerName: Debian Stretch (x86_64)
platform: x11
- dockerImage: armv6l
dockerName: Debian Stretch (Raspberry Pi v1 & ZERO)
platform: rpi
- dockerImage: armv7l
dockerName: Debian Stretch (Raspberry Pi 2 & 3)
platform: rpi
- dockerImage: aarch64
dockerName: Debian Stretch (Generic AARCH64)
platform: amlogic
steps:
- uses: actions/checkout@v3
with:
submodules: true
# Build process
- name: Build packages
env:
DOCKER_IMAGE: ${{ matrix.dockerImage }}
DOCKER_TAG: stretch
DOCKER_NAME: ${{ matrix.dockerName }}
PLATFORM: ${{ matrix.platform }}
shell: bash
run: ./.ci/ci_build.sh
# Upload artifacts (only on tagged commit)
- name: Upload artifacts
if: startsWith(github.event.ref, 'refs/tags')
uses: actions/upload-artifact@v3
with:
path: deploy/Hyperion-*
###################
###### macOS ######
###################
macOS:
name: macOS
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
with:
submodules: true
# Install dependencies
- name: Install dependencies
shell: bash
run: ./.ci/ci_install.sh
# Build process
- name: Build packages
env:
PLATFORM: osx
shell: bash
run: ./.ci/ci_build.sh
# Upload artifacts (only on tagged commit)
- name: Upload artifacts
if: startsWith(github.event.ref, 'refs/tags')
uses: actions/upload-artifact@v3
with:
path: build/Hyperion-*
#####################
###### Windows ######
#####################
windows:
name: Windows
runs-on: windows-2022
env:
VCINSTALLDIR: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC'
QT_VERSION: 5.15.2
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: true
- name: Install Qt
uses: jurplel/install-qt-action@v3
with:
version: ${{env.QT_VERSION}}
target: 'desktop'
arch: 'win64_msvc2019_64'
cache: 'true'
cache-key-prefix: 'cache-qt-windows'
- name: Cache Chocolatey downloads
uses: actions/cache@v3
with:
path: C:\Users\runneradmin\AppData\Local\Temp\chocolatey
key: ${{ runner.os }}-chocolatey
# - name: Install Python
# shell: powershell
# run: |
# choco install --no-progress python -y
- name: Install OpenSSL, DirectX SDK
shell: powershell
run: |
choco install --no-progress openssl directx-sdk -y
- name: Install libjpeg-turbo
run: |
Invoke-WebRequest https://netcologne.dl.sourceforge.net/project/libjpeg-turbo/2.0.6/libjpeg-turbo-2.0.6-vc64.exe -OutFile libjpeg-turbo.exe -UserAgent NativeHost
.\libjpeg-turbo /S
- name: Set up x64 build architecture environment
shell: cmd
run: call "${{env.VCINSTALLDIR}}\Auxiliary\Build\vcvars64.bat"
# Build packages
- name: Build packages
env:
PLATFORM: windows
shell: bash
run: ./.ci/ci_build.sh
# Upload artifacts (only on tagged commit)
- name: Upload artifacts
if: startsWith(github.event.ref, 'refs/tags')
uses: actions/upload-artifact@v3
with:
path: build/Hyperion-*
retention-days: 1
#####################################
###### Publish GitHub Releases ######
#####################################
github_publish:
name: Publish GitHub Releases
if: startsWith(github.event.ref, 'refs/tags')
needs: [Linux, macOS, windows]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
# Generate environment variables
- name: Generate environment variables from .version and tag
run: |
echo "TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
echo "VERSION=$(tr -d '\n' < .version)" >> $GITHUB_ENV
# Download artifacts from previous build process
- name: Download artifacts
uses: actions/download-artifact@v3.0.2
with:
path: artifacts
# Create draft release and upload artifacts
- name: Create draft release
uses: softprops/action-gh-release@v1
with:
name: Hyperion ${{ env.VERSION }}
tag_name: ${{ env.TAG }}
files: "artifacts/**"
draft: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
##########################
###### APT workflow ######
##########################
apt_build:
name: APT Build GitHub Releases
if: startsWith(github.event.ref, 'refs/tags')
needs: [Linux, macOS, windows]
uses: ./.github/workflows/apt.yml
secrets:
APT_GPG: ${{ secrets.APT_GPG }}
APT_USER: ${{ secrets.APT_USER }}
APT_PASSWORD: ${{ secrets.APT_PASSWORD }}
APT_DRAFT: ${{ secrets.APT_DRAFT }}

49
.github/workflows/push_pull.yml vendored Normal file
View File

@ -0,0 +1,49 @@
name: Hyperion CI/PR Builds
run-name: |
${{ github.event_name == 'push' && '🌱 Push build -' || '' }}
${{ github.event_name == 'pull_request' && format('📦 Artifacts build for PR {0} - {1}', github.event.pull_request.number, github.event.pull_request.title) || github.event.head_commit.message }}
on:
push:
branches:
- '**'
tags:
- '*'
pull_request:
branches:
- 'master'
jobs:
# GitHub Push/Pull Request (Release only on tagged commits)
github_build:
name: Qt ${{ matrix.qt_version }} Build ${{ matrix.qt_version == '6' && '(Testing))' || '' }}
strategy:
fail-fast: false
matrix:
qt_version: ['5', '6']
uses: ./.github/workflows/qt5_6.yml
secrets: inherit
with:
qt_version: ${{ matrix.qt_version }}
event_name: ${{ github.event_name }}
pull_request_number: ${{ github.event.pull_request.number }}
publish: ${{ startsWith(github.event.ref, 'refs/tags') && matrix.qt_version == '5' }}
# Build DEB/RPM Packages for APT/DNF Repository (runs only on tagged commits)
repo_build:
name: 🚀 Let Hyperion build its own repository (APT/DNF)
if: startsWith(github.event.ref, 'refs/tags')
needs: [ github_build ]
runs-on: ubuntu-latest
steps:
- name: 📲 Dispatch APT/DNF build
if: ${{ env.SECRET_HYPERION_BOT_TOKEN != null }}
uses: peter-evans/repository-dispatch@v3.0.0
with:
repository: hyperion-project/hyperion.releases-ci
token: ${{ secrets.HYPERION_BOT_TOKEN }}
event-type: releases_repo_build
client-payload: '{ "head_sha": "${{ github.sha }}", "repo_checkout": "hyperion-project/hyperion.ng" }'
env:
SECRET_HYPERION_BOT_TOKEN: ${{ secrets.HYPERION_BOT_TOKEN }}

242
.github/workflows/qt5_6.yml vendored Normal file
View File

@ -0,0 +1,242 @@
name: GitHub Qt5/6 Builds
on:
# Reusable from push_pull.yml
workflow_call:
inputs:
qt_version:
type: string
description: Build with this Qt version
default: '5'
required: false
event_name:
type: string
description: The event name
default: ''
required: false
pull_request_number:
type: string
description: The corresponding PR number
default: ''
required: false
publish:
type: boolean
description: Package publishing
default: false
required: false
env:
ghcr: hyperion-project
jobs:
######################
###### Linux #########
######################
Linux:
name: 🐧 ${{ matrix.os.description }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
os: [
{ distribution: debian, codename: buster, description: Debian Buster (x86_64), architecture: [ amd64, linux/amd64 ], platform: x11 },
{ distribution: debian, codename: buster, description: Debian Buster (Raspberry Pi 1 & Zero 1), architecture: [ armv6, linux/arm/v6 ], platform: rpi },
{ distribution: debian, codename: buster, description: Debian Buster (Raspberry Pi 2), architecture: [ armv7, linux/arm/v7 ], platform: rpi },
{ distribution: debian, codename: buster, description: Debian Buster (Raspberry Pi 3/4/5 & Zero 2), architecture: [ arm64, linux/arm64 ], platform: rpi },
{ distribution: debian, codename: bullseye, description: Debian Bullseye (x86_64), architecture: [ amd64, linux/amd64 ], platform: x11 },
{ distribution: debian, codename: bullseye, description: Debian Bullseye (Raspberry Pi 2), architecture: [ armv7, linux/arm/v7 ], platform: rpi },
{ distribution: debian, codename: bullseye, description: Debian Bullseye (Raspberry Pi 3/4/5 & Zero 2), architecture: [ arm64, linux/arm64 ], platform: rpi }
]
isQt5:
- ${{ inputs.qt_version == '5' }}
exclude:
- isQt5: true
os: { distribution: debian, codename: bullseye }
- isQt5: false
os: { distribution: debian, codename: buster }
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: 🔧 Prepare
shell: bash
run: |
echo '::group::Append PR number to version (PR only)'
if [[ "${{ inputs.event_name }}" = "pull_request" ]]; then
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ inputs.pull_request_number }}" >> .version
fi
echo '::endgroup::'
- name: 👷 Build
shell: bash
run: ./.github/scripts/build.sh
env:
DOCKER_IMAGE: ${{ matrix.os.distribution }}
DOCKER_TAG: ${{ matrix.os.codename }}${{ inputs.qt_version == '6' && '-qt6' || '' }}
PLATFORM: ${{ matrix.os.platform }}
TARGET_ARCH: ${{ matrix.os.architecture[1] }}
- name: 📦 Upload
if: ${{ inputs.publish || inputs.event_name == 'pull_request' }}
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.event_name == 'pull_request' && env.NAME || format('artifact-{0}', env.NAME) }}
path: ${{ inputs.event_name == 'pull_request' && 'deploy/*.tar.gz' || 'deploy/Hyperion-*' }}
env:
NAME: ${{ format('{0}_{1}_{2}{3}', matrix.os.distribution, matrix.os.codename, matrix.os.architecture[0], inputs.qt_version == '6' && '_qt6' || '') }}
######################
###### macOS #########
######################
macOS:
name: 🍏 macOS x64
runs-on: macos-latest
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: 🔧 Prepare
shell: bash
run: |
echo '::group::Append PR number to version (PR only)'
if [[ "${{ inputs.event_name }}" = "pull_request" ]]; then
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ inputs.pull_request_number }}" >> .version
fi
echo '::endgroup::'
echo '::group::Update/Install dependencies'
brew untap --force homebrew/core homebrew/cask
brew update || true
brew install qt${{ inputs.qt_version }} vulkan-headers ninja || true
echo '::endgroup::'
- name: 👷 Build
shell: bash
run: ./.github/scripts/build.sh
env:
PLATFORM: osx
- name: 📦 Upload
if: ${{ inputs.publish || inputs.event_name == 'pull_request' }}
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.event_name == 'pull_request' && env.NAME || format('artifact-{0}', env.NAME) }}
path: 'build/Hyperion-*'
env:
NAME: ${{ inputs.qt_version == '6' && 'macOS_x64_qt6' || 'macOS_x64' }}
######################
###### Windows #######
######################
windows:
name: 🪟 Windows x64
runs-on: windows-2022
env:
VCINSTALLDIR: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC'
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: 🔧 Prepare PR
if: ${{ inputs.event_name == 'pull_request' }}
shell: bash
run: |
echo '::group::Append PR number to version'
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ inputs.pull_request_number }}" >> .version
echo '::endgroup::'
- name: 💾 Cache/Restore
uses: actions/cache@v4
with:
path: C:\Users\runneradmin\AppData\Local\Temp\chocolatey
key: ${{ runner.os }}${{ inputs.qt_version == '6' && '-chocolatey-qt6' || '-chocolatey' }}
- name: 📥 Install DirectX SDK, OpenSSL, libjpeg-turbo ${{ inputs.qt_version == '6' && 'and Vulkan-SDK' || '' }}
shell: powershell
run: |
choco install --no-progress directx-sdk ${{env.VULKAN_SDK}} -y
choco install --no-progress ${{env.OPENSSL}} -y
Invoke-WebRequest https://netcologne.dl.sourceforge.net/project/libjpeg-turbo/3.0.1/libjpeg-turbo-3.0.1-vc64.exe -OutFile libjpeg-turbo.exe -UserAgent NativeHost
.\libjpeg-turbo /S
env:
VULKAN_SDK: ${{ inputs.qt_version == '6' && 'vulkan-sdk' || '' }}
OPENSSL: ${{ inputs.qt_version == '6' && 'openssl' || 'openssl --version=1.1.1.2100' }}
- name: 📥 Install Qt
uses: jurplel/install-qt-action@v3
with:
version: ${{ inputs.qt_version == '6' && '6.5.2' || '5.15.2' }}
target: 'desktop'
modules: ${{ inputs.qt_version == '6' && 'qtserialport' || '' }}
arch: 'win64_msvc2019_64'
cache: 'true'
cache-key-prefix: 'cache-qt-windows'
- name: 🛠️ Setup MSVC
shell: cmd
run: call "${{env.VCINSTALLDIR}}\Auxiliary\Build\vcvars64.bat"
- name: 👷 Build
shell: bash
run: ./.github/scripts/build.sh
env:
PLATFORM: windows
- name: 📦 Upload
if: ${{ inputs.publish || inputs.event_name == 'pull_request' }}
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.event_name == 'pull_request' && env.NAME || format('artifact-{0}', env.NAME) }}
path: ${{ inputs.event_name == 'pull_request' && 'build/*.exe' || 'build/Hyperion-*' }}
env:
NAME: ${{ inputs.qt_version == '6' && 'windows_x64_qt6' || 'windows_x64' }}
#####################################
###### Publish GitHub Releases ######
#####################################
github_publish:
name: 🚀 Publish GitHub Releases
if: ${{ inputs.qt_version == '5' && inputs.publish }}
needs: [Linux, macOS, windows]
runs-on: ubuntu-latest
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
- name: 🔧 Prepare
run: |
echo '::group::Generate environment variables from .version and tag'
echo "TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
echo "VERSION=$(tr -d '\n' < .version)" >> $GITHUB_ENV
echo '::endgroup::'
- name: 💾 Artifact download
uses: actions/download-artifact@v4.1.7
with:
pattern: artifact-*
path: all-artifacts
- name: 📦 Upload
uses: softprops/action-gh-release@v2
with:
name: Hyperion ${{ env.VERSION }}
tag_name: ${{ env.TAG }}
files: "all-artifacts/**"
draft: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,16 +1,19 @@
name: Release Actions
name: 🚀 Release Actions
run-name: 🚀 Let HyperBian create
on:
release:
types: [published]
jobs:
hyperbian:
name: Let HyperBian create
name: 🚀 Let HyperBian create
runs-on: ubuntu-latest
steps:
# Dispatch event to build new HyperBian image
- name: Dispatch HyperBian build
uses: peter-evans/repository-dispatch@v2.1.1
- name: 📲 Dispatch HyperBian build
uses: peter-evans/repository-dispatch@v3.0.0
if: ${{ github.repository_owner == 'hyperion-project'}}
with:
repository: hyperion-project/HyperBian

4
.gitmodules vendored
View File

@ -1,7 +1,7 @@
[submodule "dependencies/external/rpi_ws281x"]
path = dependencies/external/rpi_ws281x
url = https://github.com/jgarff/rpi_ws281x
branch = master
url = https://github.com/hyperion-project/rpi_ws281x
branch = main
[submodule "dependencies/external/flatbuffers"]
path = dependencies/external/flatbuffers
url = https://github.com/google/flatbuffers

View File

@ -1,27 +0,0 @@
extraction:
cpp:
prepare:
packages:
- "git"
- "cmake"
- "build-essential"
- "qtbase5-dev"
- "libqt5serialport5-dev"
- "libqt5sql5-sqlite"
- "libqt5svg5-dev"
- "libqt5x11extras5-dev"
- "libusb-1.0-0-dev"
- "python3-dev"
- "libcec-dev"
- "libxcb-image0-dev"
- "libxcb-util0-dev"
- "libxcb-shm0-dev"
- "libxcb-render0-dev"
- "libxcb-randr0-dev"
- "libxrandr-dev"
- "libxrender-dev"
- "libavahi-core-dev"
- "libavahi-compat-libdnssd-dev"
- "libturbojpeg0-dev"
- "libjpeg-dev"
- "libssl-dev"

View File

@ -1 +1 @@
2.0.16-beta.1
2.0.17-beta.1

View File

@ -4,18 +4,128 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased](https://github.com/hyperion-project/hyperion.ng/compare/2.0.15...HEAD)
## [Unreleased](https://github.com/hyperion-project/hyperion.ng/compare/2.0.16...HEAD)
### Breaking
**JSON-API**
- Align JSON subscription update elements. `ledcolors-imagestream-update, ledcolors-ledstream-update, logmsg-update` now return data via `data` and not `result
### Added
- Support gaps on Matrix Layout (#1696)
**JSON-API**
- New subscription support for event updates, i.e. `Suspend, Resume, Idle, idleResume, Restart, Quit`.
- Support direct or multiple instance addressing via single requests (#809)
- Support of `serverinfo` subcommands: `getInfo, subscribe, unsubscribe, getSubscriptions, getSubscriptionCommands`
- [Overview](https://github.com/hyperion-project/hyperion.ng/blob/API_Auth/doc/development/JSON-API%20_Commands_Overview.md) of API commands and subscription updates
### Changed
### Fixed
- Fixed missing Include limits in QJsonSchemaChecker
- Fixed: Cross Site Scripting Vulnerability (CVE-2024-4174, CVE-2024-4175)
- Fixed: hyperion-v4l2 taking screenshot failed (#1722)
- Nanoleaf: Support new devices and do not restore ExtControl state
- Workaround to address Web UI keeps forcing browser to download the html instead (#1692)
- Fixed: Kodi Color Calibration, Refactor Wizards (#1674)
- Fixed: Token Dialog not closing
- Fixed: Philip Hue APIv2 support without Entertainment group defined (#1742)
## Removed
**JSON-API**
- Refactored JSON-API to ensure consistent authorization behaviour across sessions and single requests with token authorization.
- Provide additional error details with API responses, esp. on JSON parsing, validation or token errors.
- Generate random TANs for every API request from the Hyperion UI
- Fixed: Handling of IP4 addresses wrapped in IPv6 for external network connections-
### Removed
**JSON-API**
- Removed ability to enable/disable local admin authorization. All admin commands require authorization, i.e. `authorize-adminRequired` will always be `true`.
- Removed `session-updates` subscription
- `serverinfo/subscribe` element will be deprecated and replaced by corresponding subcommand
## [2.0.16](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.16) - 2024-01
### Added
- New languages: Hebrew, Indonesian, Ukrainian
**Event Services**
Newly introduced Event Service configuration and consistent handling across all components
- Suspend/Resume & Screen Locking support for MaxOS
- Allow to enable/disable suspend & lock on operating system events (#1633, #1632)
- Scheduled events allowing to suspend,resume, etc. (#1088)
- Configurable CEC event handling
##### LED-Devices
**Philips Hue**
- APIv2 support, incl. full https security and certificate validation
- Multi-Segment device support, e.g. Gradient light
- Use Entertainment area device location for Hyperion layout in addition to manual locations
- Option to layout by focussing on full- or only center of entertainment area
- Wizard supports multiple Hue-Bridge discovery
- Support of DIYHue specifics. DIYHue bridge's name must start with "DIY"
- Backward compatibility for bridges not supporting APIv2 and/or Entertainment API
Note: The wizard will configure an APIv2 capable bridge always with Entertainment to ensure the best experience.
**Nanoleaf**
- Wizard to generate user authorization token allowing users to configure the device via a single window
- Generation of a default layout per device's configuration, including orientation
- Lines support
### Changed
- Updated misleading error messages in case Hyperion is not able to support the suspend/lock feature (#1622)
- Restart Serial Device, if write error occurred
- ws281x - Update logic to identify is user is admin and disable device configuration if not (#1621)
- Hide Hyperion from the Dock on macOS, as all features can be accessed from the menubar - Thanks @Rastafabisch
### Fixed
- Correctly display local language characters in log, e.g. Umlauts
- Fixed that Audio Capture is enabled after reboot automatically (#1581)
- Fixed that Audio Capture is not shown when there is no screen nor video grabber
- Audio Capture settings are no longer ignored (#1630)
- Fixed that the Matrix effect finds its image - Thanks @lsellens
- MDNSBrower - Fixed, if timeout while resolving host occurs
- Non image updates ignored blacklisted LEDs (#1634)
- Fixed that Windows OsEvents failed in non-GUI mode (#1671)
- Addressed serious (#1425) and some smaller memory leaks
##### LED-Devices
**WLED**
- Fixed UI handling, if segment streaming is not supported
**Nanoleaf**
- "Panel numbering sequence" was not configurable any longer
- Number of panels increased during retries (#1643)
### Removed
##### LED-Devices
**Philips Hue**
- "Switch Off On Black" for APIv2, as the original bridge will switch off LEDs itself.
- "Candy Gamma" for APIv2, as the bridge maps the RGB values best per device.
**Nanoleaf**
- Removed "Start Position" in favour of the general Blacklist feature provided
### Technical
- Changed default build from Stretch to Buster
- Support Qt 6.7, Update to Protobuf 25.1, Update mbedTLS to v3.4.0, Update flatbuffers to v23.5.26
- Use C++17 standard as default
- Started using SmartPointers (#981)
- Added Pull Request (PR) installation script, allowing users to test development builds savely on Linux
- Fixed missing include limits in QJsonSchemaChecker - Thanks @Portisch
- Fixed dependencies for deb packages in Debian Bookworm (#1579) - Thanks @hg42, @Psirus
- Fixed git version identification when run in docker and local code
- Address cmake deprecation warnings, cmake 3.5 is required at minimum now
- Address some build warnings
- Removed UniqueConnections from Lambdas, as not supported
## [2.0.15](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.15) - 2023-02
@ -42,6 +152,7 @@ To allow segment streaming, enable "Realtime - Use main segment only" in WLED's
- REST API - Increased default timeout to address "Operation cancelled" errors
- LED Devices: Allow to differentiate between recoverable/unrecoverable errors
- Renamed LED area assignment naming to provide clarity on the processing algorithms
- Updated SEDU default baud rates
### Fixed

View File

@ -1,17 +1,17 @@
cmake_minimum_required(VERSION 3.1.0)
cmake_minimum_required(VERSION 3.5.0)
message( STATUS "CMake Version: ${CMAKE_VERSION}" )
message(STATUS "CMake Version: ${CMAKE_VERSION}")
macro(addIndent text)
if(${CMAKE_VERSION} VERSION_GREATER "3.16.0")
list(APPEND CMAKE_MESSAGE_INDENT ${text})
endif()
if(${CMAKE_VERSION} VERSION_GREATER "3.16.0")
list(APPEND CMAKE_MESSAGE_INDENT ${text})
endif()
endmacro()
macro(removeIndent)
if(${CMAKE_VERSION} VERSION_GREATER "3.16.0")
list(POP_BACK CMAKE_MESSAGE_INDENT)
endif()
if(${CMAKE_VERSION} VERSION_GREATER "3.16.0")
list(POP_BACK CMAKE_MESSAGE_INDENT)
endif()
endmacro()
PROJECT(hyperion)
@ -31,192 +31,199 @@ set(CMAKE_AUTOMOC ON)
# auto prepare .qrc files
set(CMAKE_AUTORCC ON)
# Configure CCache if available
# multicore compiling
include(ProcessorCount)
ProcessorCount(NCORES)
if(NOT NCORES EQUAL 0)
set(CMAKE_BUILD_PARALLEL_LEVEL NCORES)
endif()
# Configure CCache ifavailable
find_program(CCACHE_FOUND ccache)
if ( CCACHE_FOUND )
if(CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)
# enable C++14; MSVC doesn't have c++14 feature switch
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
if(APPLE)
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("Werror=unguarded-availability" REQUIRED_UNGUARDED_AVAILABILITY)
if(REQUIRED_UNGUARDED_AVAILABILITY)
list(APPEND CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "Werror=unguarded-availability")
endif()
# enable C++17
if(APPLE)
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("Werror=unguarded-availability" REQUIRED_UNGUARDED_AVAILABILITY)
if(REQUIRED_UNGUARDED_AVAILABILITY)
list(APPEND CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "Werror=unguarded-availability")
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-psabi")
endif()
set(CMAKE_CXX_STANDARD 14)
set(CXX_STANDARD_REQUIRED ON)
set(CXX_EXTENSIONS OFF)
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-psabi")
endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Set build variables
# Grabber
SET ( DEFAULT_AMLOGIC OFF )
SET ( DEFAULT_DISPMANX OFF )
SET ( DEFAULT_DX OFF )
SET ( DEFAULT_MF OFF )
SET ( DEFAULT_OSX OFF )
SET ( DEFAULT_QT ON )
SET ( DEFAULT_V4L2 OFF )
SET ( DEFAULT_AUDIO ON )
SET ( DEFAULT_X11 OFF )
SET ( DEFAULT_XCB OFF )
set(DEFAULT_AMLOGIC OFF)
set(DEFAULT_DISPMANX OFF)
set(DEFAULT_DX OFF)
set(DEFAULT_MF OFF)
set(DEFAULT_OSX OFF)
set(DEFAULT_QT ON )
set(DEFAULT_V4L2 OFF)
set(DEFAULT_AUDIO ON )
set(DEFAULT_X11 OFF)
set(DEFAULT_XCB OFF)
# Input
SET ( DEFAULT_BOBLIGHT_SERVER ON )
SET ( DEFAULT_CEC OFF )
SET ( DEFAULT_FLATBUF_SERVER ON )
SET ( DEFAULT_PROTOBUF_SERVER ON )
set(DEFAULT_BOBLIGHT_SERVER ON )
set(DEFAULT_CEC OFF)
set(DEFAULT_FLATBUF_SERVER ON )
set(DEFAULT_PROTOBUF_SERVER ON )
# Output
SET ( DEFAULT_FORWARDER ON )
SET ( DEFAULT_FLATBUF_CONNECT ON )
set(DEFAULT_FORWARDER ON )
set(DEFAULT_FLATBUF_CONNECT ON )
# LED-Devices
SET ( DEFAULT_DEV_NETWORK ON )
SET ( DEFAULT_DEV_SERIAL ON )
SET ( DEFAULT_DEV_SPI OFF )
SET ( DEFAULT_DEV_TINKERFORGE OFF )
SET ( DEFAULT_DEV_USB_HID OFF )
SET ( DEFAULT_DEV_WS281XPWM OFF )
SET ( DEFAULT_DEV_FTDI ON )
set(DEFAULT_DEV_NETWORK ON )
set(DEFAULT_DEV_SERIAL ON )
set(DEFAULT_DEV_SPI OFF)
set(DEFAULT_DEV_TINKERFORGE OFF)
set(DEFAULT_DEV_USB_HID OFF)
set(DEFAULT_DEV_WS281XPWM OFF)
set(DEFAULT_DEV_FTDI ON )
# Services
SET ( DEFAULT_EFFECTENGINE ON )
SET ( DEFAULT_EXPERIMENTAL OFF )
SET ( DEFAULT_MDNS ON )
SET ( DEFAULT_REMOTE_CTL ON )
set(DEFAULT_EFFECTENGINE ON )
set(DEFAULT_EXPERIMENTAL OFF)
set(DEFAULT_MDNS ON )
set(DEFAULT_REMOTE_CTL ON )
# Build
SET ( DEFAULT_JSONCHECKS ON )
SET ( DEFAULT_DEPLOY_DEPENDENCIES ON )
SET ( DEFAULT_USE_SYSTEM_FLATBUFFERS_LIBS OFF )
SET ( DEFAULT_USE_SYSTEM_PROTO_LIBS OFF )
SET ( DEFAULT_USE_SYSTEM_MBEDTLS_LIBS OFF )
SET ( DEFAULT_USE_SYSTEM_QMDNS_LIBS OFF )
SET ( DEFAULT_TESTS OFF )
set(DEFAULT_JSONCHECKS ON )
set(DEFAULT_DEPLOY_DEPENDENCIES ON )
set(DEFAULT_USE_SYSTEM_FLATBUFFERS_LIBS OFF)
set(DEFAULT_USE_SYSTEM_PROTO_LIBS OFF)
set(DEFAULT_USE_SYSTEM_MBEDTLS_LIBS OFF)
set(DEFAULT_USE_SYSTEM_QMDNS_LIBS OFF)
set(DEFAULT_TESTS OFF)
# Build Hyperion with a reduced set of functionality, overwrites other default values
SET ( DEFAULT_HYPERION_LIGHT OFF )
set(DEFAULT_HYPERION_LIGHT OFF)
IF ( ${CMAKE_SYSTEM} MATCHES "Linux" )
SET ( DEFAULT_FB ON )
SET ( DEFAULT_V4L2 ON )
SET ( DEFAULT_DEV_SPI ON )
SET ( DEFAULT_DEV_TINKERFORGE ON )
SET ( DEFAULT_DEV_USB_HID ON )
SET ( DEFAULT_CEC ON )
ELSEIF ( WIN32 )
SET ( DEFAULT_DX ON )
SET ( DEFAULT_MF ON )
SET ( DEFAULT_DEV_FTDI OFF )
ELSE()
SET ( DEFAULT_FB OFF )
SET ( DEFAULT_V4L2 OFF )
SET ( DEFAULT_DEV_SPI OFF )
SET ( DEFAULT_DEV_TINKERFORGE OFF )
SET ( DEFAULT_DEV_USB_HID OFF )
SET ( DEFAULT_CEC OFF )
ENDIF()
if(${CMAKE_SYSTEM} MATCHES "Linux")
set(DEFAULT_FB ON)
set(DEFAULT_V4L2 ON)
set(DEFAULT_DEV_SPI ON)
set(DEFAULT_DEV_TINKERFORGE ON)
set(DEFAULT_DEV_USB_HID ON)
set(DEFAULT_CEC ON)
elseif (WIN32)
set(DEFAULT_DX ON )
set(DEFAULT_MF ON )
set(DEFAULT_DEV_FTDI OFF)
else()
set(DEFAULT_FB OFF)
set(DEFAULT_V4L2 OFF)
set(DEFAULT_DEV_SPI OFF)
set(DEFAULT_DEV_TINKERFORGE OFF)
set(DEFAULT_DEV_USB_HID OFF)
set(DEFAULT_CEC OFF)
endif()
if ( NOT DEFINED PLATFORM )
if ( APPLE )
SET( PLATFORM "osx")
elseif ( WIN32 )
SET( PLATFORM "windows")
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86" )
SET( PLATFORM "x11")
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64")
SET( PLATFORM "rpi")
FILE( READ /proc/cpuinfo SYSTEM_CPUINFO )
STRING ( TOLOWER "${SYSTEM_CPUINFO}" SYSTEM_CPUINFO )
if ( "${SYSTEM_CPUINFO}" MATCHES "amlogic" AND ${CMAKE_SIZEOF_VOID_P} EQUAL 4 )
SET( PLATFORM "amlogic" )
elseif ( ("${SYSTEM_CPUINFO}" MATCHES "amlogic" OR "${SYSTEM_CPUINFO}" MATCHES "odroid-c2" OR "${SYSTEM_CPUINFO}" MATCHES "vero4k") AND ${CMAKE_SIZEOF_VOID_P} EQUAL 8 )
SET( PLATFORM "amlogic64" )
if(NOT DEFINED PLATFORM)
if(APPLE)
set(PLATFORM "osx")
elseif (WIN32)
set(PLATFORM "windows")
elseif ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86")
set(PLATFORM "x11")
elseif ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64")
set(PLATFORM "rpi")
file(READ /proc/cpuinfo SYSTEM_CPUINFO)
STRING (TOLOWER "${SYSTEM_CPUINFO}" SYSTEM_CPUINFO)
if("${SYSTEM_CPUINFO}" MATCHES "amlogic" AND ${CMAKE_SIZEOF_VOID_P} EQUAL 4)
set(PLATFORM "amlogic")
elseif (("${SYSTEM_CPUINFO}" MATCHES "amlogic" OR "${SYSTEM_CPUINFO}" MATCHES "odroid-c2" OR "${SYSTEM_CPUINFO}" MATCHES "vero4k") AND ${CMAKE_SIZEOF_VOID_P} EQUAL 8)
set(PLATFORM "amlogic64")
endif()
endif()
if ( PLATFORM )
message( STATUS "PLATFORM is not defined, evaluated platform: ${PLATFORM}")
if(PLATFORM)
message(STATUS "PLATFORM is not defined, evaluated platform: ${PLATFORM}")
else()
message( FATAL_ERROR "PLATFORM is not defined and could not be evaluated. Set -DPLATFORM=<rpi|amlogic|amlogic64|x11|x11-dev|osx|osx-dev>")
message(FATAL_ERROR "PLATFORM is not defined and could not be evaluated. Set -DPLATFORM=<rpi|amlogic|amlogic64|x11|x11-dev|osx|osx-dev>")
endif()
endif()
message( STATUS "PLATFORM: ${PLATFORM}")
message(STATUS "PLATFORM: ${PLATFORM}")
# Macro to get path of first sub dir of a dir, used for MAC OSX lib/header searching
MACRO(FIRSTSUBDIR result curdir)
FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
SET(dirlist "")
FOREACH(child ${children})
IF(IS_DIRECTORY ${curdir}/${child})
LIST(APPEND dirlist "${curdir}/${child}")
BREAK()
ENDIF()
ENDFOREACH()
SET(${result} ${dirlist})
ENDMACRO()
macro(FIRSTSUBDIR result curdir)
file(GLOB children RELATIVE ${curdir} ${curdir}/*)
set(dirlist "")
foreach(child ${children})
if(IS_DIRECTORY ${curdir}/${child})
list(APPEND dirlist "${curdir}/${child}")
break()
endif()
endforeach()
set(${result} ${dirlist})
endmacro()
if("${PLATFORM}" MATCHES "osx")
# specify the min version of the target platform (only GitHub Actions)
if(DEFINED ENV{GITHUB_WORKSPACE})
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15")
endif()
if ( "${PLATFORM}" MATCHES "osx" )
# specify the min version of the target platform
SET ( CMAKE_OSX_DEPLOYMENT_TARGET "10.15" )
# add specific prefix paths
FIRSTSUBDIR(SUBDIRPY "/usr/local/opt/python3/Frameworks/Python.framework/Versions")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${SUBDIRPY})
include_directories("/opt/X11/include/")
SET ( DEFAULT_OSX ON )
SET ( DEFAULT_AUDIO OFF )
SET ( DEFAULT_DEV_USB_HID ON )
set(DEFAULT_OSX ON )
set(DEFAULT_AUDIO OFF)
set(DEFAULT_DEV_USB_HID ON )
elseif ( "${PLATFORM}" MATCHES "rpi" )
SET ( DEFAULT_DISPMANX ON )
SET ( DEFAULT_DEV_WS281XPWM ON )
elseif ( "${PLATFORM}" STREQUAL "amlogic" )
SET ( DEFAULT_AMLOGIC ON )
elseif ( "${PLATFORM}" STREQUAL "amlogic-dev" )
SET ( DEFAULT_AMLOGIC ON )
SET ( DEFAULT_DISPMANX OFF )
SET ( DEFAULT_QT OFF )
SET ( DEFAULT_CEC OFF )
elseif ( "${PLATFORM}" STREQUAL "amlogic64" )
SET ( DEFAULT_AMLOGIC ON )
elseif ( "${PLATFORM}" MATCHES "x11" )
SET ( DEFAULT_X11 ON )
SET ( DEFAULT_XCB ON )
if ( "${PLATFORM}" STREQUAL "x11-dev" )
SET ( DEFAULT_AMLOGIC ON)
SET ( DEFAULT_DEV_WS281XPWM ON )
elseif ("${PLATFORM}" MATCHES "rpi")
set(DEFAULT_DISPMANX ON)
set(DEFAULT_DEV_WS281XPWM ON)
elseif ("${PLATFORM}" MATCHES "^amlogic")
set(DEFAULT_AMLOGIC ON)
if("${PLATFORM}" MATCHES "-dev$")
set(DEFAULT_AMLOGIC ON)
set(DEFAULT_DISPMANX OFF)
set(DEFAULT_QT OFF)
set(DEFAULT_CEC OFF)
endif()
elseif ( "${PLATFORM}" STREQUAL "imx6" )
SET ( DEFAULT_FB ON )
elseif ("${PLATFORM}" MATCHES "^x11")
set(DEFAULT_X11 ON)
set(DEFAULT_XCB ON)
if("${PLATFORM}" MATCHES "-dev$")
set(DEFAULT_AMLOGIC ON)
set(DEFAULT_DEV_WS281XPWM ON)
endif()
elseif ("${PLATFORM}" STREQUAL "imx6")
set(DEFAULT_FB ON)
endif()
# enable tests for -dev builds
if ( "${PLATFORM}" MATCHES "-dev" )
SET ( DEFAULT_TESTS ON )
if("${PLATFORM}" MATCHES "-dev$")
set(DEFAULT_TESTS ON)
endif()
STRING( TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE)
STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" )
ADD_DEFINITIONS( ${PLATFORM_DEFINE} )
string(TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE)
string(REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}")
ADD_DEFINITIONS(${PLATFORM_DEFINE})
# set the build options
option(HYPERION_LIGHT "Build Hyperion with a reduced set of functionality" ${DEFAULT_HYPERION_LIGHT} )
option(HYPERION_LIGHT "Build Hyperion with a reduced set of functionality" ${DEFAULT_HYPERION_LIGHT})
message(STATUS "HYPERION_LIGHT = ${HYPERION_LIGHT}")
if (HYPERION_LIGHT)
if(HYPERION_LIGHT)
message(STATUS "HYPERION_LIGHT: Hyperion is build with a reduced set of functionality.")
# Disable Grabbers
SET ( DEFAULT_AMLOGIC OFF )
@ -227,48 +234,49 @@ if (HYPERION_LIGHT)
SET ( DEFAULT_OSX OFF )
SET ( DEFAULT_QT OFF )
SET ( DEFAULT_V4L2 OFF )
SET ( DEFAULT_AUDIO OFF )
SET ( DEFAULT_X11 OFF )
SET ( DEFAULT_XCB OFF )
SET ( DEFAULT_AUDIO OFF )
# Disable Input Servers
SET ( DEFAULT_BOBLIGHT_SERVER OFF )
SET ( DEFAULT_CEC OFF )
SET ( DEFAULT_FLATBUF_SERVER OFF )
SET ( DEFAULT_PROTOBUF_SERVER OFF )
set(DEFAULT_BOBLIGHT_SERVER OFF)
set(DEFAULT_CEC OFF)
set(DEFAULT_FLATBUF_SERVER OFF)
set(DEFAULT_PROTOBUF_SERVER OFF)
# Disable Output Connectors
SET ( DEFAULT_FORWARDER OFF )
SET ( DEFAULT_FLATBUF_CONNECT OFF )
set(DEFAULT_FORWARDER OFF)
set(DEFAULT_FLATBUF_CONNECT OFF)
# Disable Services
SET ( DEFAULT_EFFECTENGINE OFF )
set(DEFAULT_EFFECTENGINE OFF)
endif()
message(STATUS "Grabber options:")
addIndent(" - ")
option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC} )
option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC})
message(STATUS "ENABLE_AMLOGIC = ${ENABLE_AMLOGIC}")
option(ENABLE_DISPMANX "Enable the RPi dispmanx grabber" ${DEFAULT_DISPMANX} )
option(ENABLE_DISPMANX "Enable the RPi dispmanx grabber" ${DEFAULT_DISPMANX})
message(STATUS "ENABLE_DISPMANX = ${ENABLE_DISPMANX}")
option(ENABLE_DX "Enable the DirectX grabber" ${DEFAULT_DX})
message(STATUS "ENABLE_DX = ${ENABLE_DX}")
if (ENABLE_AMLOGIC)
SET(ENABLE_FB ON)
if(ENABLE_AMLOGIC)
set(ENABLE_FB ON)
else()
option(ENABLE_FB " Enable the framebuffer grabber" ${DEFAULT_FB} )
option(ENABLE_FB " Enable the framebuffer grabber" ${DEFAULT_FB})
endif()
message(STATUS "ENABLE_FB = ${ENABLE_FB}")
option(ENABLE_MF "Enable the Media Foundation grabber" ${DEFAULT_MF})
message(STATUS "ENABLE_MF = ${ENABLE_MF}")
option(ENABLE_OSX "Enable the OSX grabber" ${DEFAULT_OSX} )
option(ENABLE_OSX "Enable the OSX grabber" ${DEFAULT_OSX})
message(STATUS "ENABLE_OSX = ${ENABLE_OSX}")
option(ENABLE_QT "Enable the Qt grabber" ${DEFAULT_QT})
@ -279,30 +287,28 @@ message(STATUS "ENABLE_V4L2 = ${ENABLE_V4L2}")
option(ENABLE_X11 "Enable the X11 grabber" ${DEFAULT_X11})
message(STATUS "ENABLE_X11 = ${ENABLE_X11}")
option(ENABLE_AUDIO "Enable the AUDIO grabber" ${DEFAULT_AUDIO})
message(STATUS "ENABLE_AUDIO = ${ENABLE_AUDIO}")
option(ENABLE_WS281XPWM "Enable the WS281x-PWM device" ${DEFAULT_WS281XPWM} )
message(STATUS "ENABLE_WS281XPWM = ${ENABLE_WS281XPWM}")
option(ENABLE_XCB "Enable the XCB grabber" ${DEFAULT_XCB})
message(STATUS "ENABLE_XCB = ${ENABLE_XCB}")
option(ENABLE_AUDIO "Enable the AUDIO grabber" ${DEFAULT_AUDIO})
message(STATUS "ENABLE_AUDIO = ${ENABLE_AUDIO}")
removeIndent()
message(STATUS "Input options:")
addIndent(" - ")
option(ENABLE_BOBLIGHT_SERVER "Enable BOBLIGHT server" ${DEFAULT_BOBLIGHT_SERVER} )
option(ENABLE_BOBLIGHT_SERVER "Enable BOBLIGHT server" ${DEFAULT_BOBLIGHT_SERVER})
message(STATUS "ENABLE_BOBLIGHT_SERVER = ${ENABLE_BOBLIGHT_SERVER}")
option(ENABLE_CEC "Enable the libcec and CEC control" ${DEFAULT_CEC} )
option(ENABLE_CEC "Enable the libcec and CEC control" ${DEFAULT_CEC})
message(STATUS "ENABLE_CEC = ${ENABLE_CEC}")
option(ENABLE_FLATBUF_SERVER "Enable Flatbuffers server" ${DEFAULT_FLATBUF_SERVER} )
option(ENABLE_FLATBUF_SERVER "Enable Flatbuffers server" ${DEFAULT_FLATBUF_SERVER})
message(STATUS "ENABLE_FLATBUF_SERVER = ${ENABLE_FLATBUF_SERVER}")
option(ENABLE_PROTOBUF_SERVER "Enable Protocol Buffers server" ${DEFAULT_PROTOBUF_SERVER} )
option(ENABLE_PROTOBUF_SERVER "Enable Protocol Buffers server" ${DEFAULT_PROTOBUF_SERVER})
message(STATUS "ENABLE_PROTOBUF_SERVER = ${ENABLE_PROTOBUF_SERVER}")
removeIndent()
@ -310,13 +316,13 @@ removeIndent()
message(STATUS "Output options:")
addIndent(" - ")
option(ENABLE_FORWARDER "Enable Hyperion forwarding" ${DEFAULT_FORWARDER} )
option(ENABLE_FORWARDER "Enable Hyperion forwarding" ${DEFAULT_FORWARDER})
message(STATUS "ENABLE_FORWARDER = ${ENABLE_FORWARDER}")
if (ENABLE_FORWARDER)
SET(ENABLE_FLATBUF_CONNECT ON)
if(ENABLE_FORWARDER)
set(ENABLE_FLATBUF_CONNECT ON)
else()
option(ENABLE_FLATBUF_CONNECT "Enable Flatbuffers connecting remotely" ${DEFAULT_FLATBUF_CONNECT} )
option(ENABLE_FLATBUF_CONNECT "Enable Flatbuffers connecting remotely" ${DEFAULT_FLATBUF_CONNECT})
endif()
message(STATUS "ENABLE_FLATBUF_CONNECT = ${ENABLE_FLATBUF_CONNECT}")
@ -325,22 +331,22 @@ removeIndent()
message(STATUS "LED-Device options:")
addIndent(" - ")
option(ENABLE_DEV_NETWORK "Enable the Network devices" ${DEFAULT_DEV_NETWORK} )
option(ENABLE_DEV_NETWORK "Enable the Network devices" ${DEFAULT_DEV_NETWORK})
message(STATUS "ENABLE_DEV_NETWORK = ${ENABLE_DEV_NETWORK}")
option(ENABLE_DEV_SERIAL "Enable the Serial devices" ${DEFAULT_DEV_SERIAL} )
option(ENABLE_DEV_SERIAL "Enable the Serial devices" ${DEFAULT_DEV_SERIAL})
message(STATUS "ENABLE_DEV_SERIAL = ${ENABLE_DEV_SERIAL}")
option(ENABLE_DEV_SPI "Enable the SPI device" ${DEFAULT_DEV_SPI} )
option(ENABLE_DEV_SPI "Enable the SPI device" ${DEFAULT_DEV_SPI})
message(STATUS "ENABLE_DEV_SPI = ${ENABLE_DEV_SPI}")
option(ENABLE_DEV_TINKERFORGE "Enable the TINKERFORGE device" ${DEFAULT_DEV_TINKERFORGE})
message(STATUS "ENABLE_DEV_TINKERFORGE = ${ENABLE_DEV_TINKERFORGE}")
option(ENABLE_DEV_USB_HID "Enable the libusb and hid devices" ${DEFAULT_DEV_USB_HID} )
option(ENABLE_DEV_USB_HID "Enable the libusb and hid devices" ${DEFAULT_DEV_USB_HID})
message(STATUS "ENABLE_DEV_USB_HID = ${ENABLE_DEV_USB_HID}")
option(ENABLE_DEV_WS281XPWM "Enable the WS281x-PWM device" ${DEFAULT_DEV_WS281XPWM} )
option(ENABLE_DEV_WS281XPWM "Enable the WS281x-PWM device" ${DEFAULT_DEV_WS281XPWM})
message(STATUS "ENABLE_DEV_WS281XPWM = ${ENABLE_DEV_WS281XPWM}")
option(ENABLE_DEV_FTDI "Enable the FTDI devices" ${DEFAULT_DEV_FTDI} )
@ -384,7 +390,7 @@ endif()
message(STATUS "DEFAULT_USE_SYSTEM_MBEDTLS_LIBS = ${DEFAULT_USE_SYSTEM_MBEDTLS_LIBS}")
if (ENABLE_MDNS)
if(ENABLE_MDNS)
message(STATUS "DEFAULT_USE_SYSTEM_QMDNS_LIBS = ${DEFAULT_USE_SYSTEM_QMDNS_LIBS}")
endif()
@ -397,14 +403,14 @@ message(STATUS "ENABLE_TESTS = ${ENABLE_TESTS}")
removeIndent()
SET ( FLATBUFFERS_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/flatbuf )
SET ( FLATBUFFERS_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/flatbuf )
set(FLATBUFFERS_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/flatbuf)
set(FLATBUFFERS_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/flatbuf)
SET ( PROTOBUF_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/proto )
SET ( PROTOBUF_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/proto )
set(PROTOBUF_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/proto)
set(PROTOBUF_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/proto)
if(ENABLE_JSONCHECKS OR ENABLE_EFFECTENGINE)
if ("${CMAKE_VERSION}" VERSION_LESS "3.12.0")
if("${CMAKE_VERSION}" VERSION_LESS "3.12.0")
set(Python_ADDITIONAL_VERSIONS 3.5)
find_package(PythonInterp 3.5 REQUIRED)
else()
@ -417,38 +423,38 @@ endif()
if(ENABLE_JSONCHECKS)
# check all json files
FILE ( GLOB_RECURSE HYPERION_SCHEMAS RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/libsrc/*schema*.json )
SET( JSON_FILES ${CMAKE_BINARY_DIR}/config/hyperion.config.json.default ${HYPERION_SCHEMAS})
file (GLOB_RECURSE HYPERION_SCHEMAS RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/libsrc/*schema*.json)
set(JSON_FILES ${CMAKE_BINARY_DIR}/config/hyperion.config.json.default ${HYPERION_SCHEMAS})
EXECUTE_PROCESS (
execute_process (
COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkjson.py ${JSON_FILES}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_JSON_FAILED
)
IF ( ${CHECK_JSON_FAILED} )
MESSAGE (FATAL_ERROR "check of json files failed" )
ENDIF ()
if(${CHECK_JSON_FAILED})
message (FATAL_ERROR "check of json files failed")
endif()
if(ENABLE_EFFECTENGINE)
EXECUTE_PROCESS (
execute_process (
COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkeffects.py effects effects/schema
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_EFFECTS_FAILED
)
IF ( ${CHECK_EFFECTS_FAILED} )
MESSAGE (FATAL_ERROR "check of json effect files failed" )
ENDIF ()
if(${CHECK_EFFECTS_FAILED})
message (FATAL_ERROR "check of json effect files failed")
endif()
endif()
EXECUTE_PROCESS (
execute_process (
COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkschema.py ${CMAKE_BINARY_DIR}/config/hyperion.config.json.default libsrc/hyperion/hyperion.schema.json
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_CONFIG_FAILED
)
IF ( ${CHECK_CONFIG_FAILED} )
MESSAGE (FATAL_ERROR "check of json default config failed" )
ENDIF ()
if(${CHECK_CONFIG_FAILED})
message (FATAL_ERROR "check of json default config failed")
endif()
endif(ENABLE_JSONCHECKS)
# Add project specific cmake modules (find, etc)
@ -462,8 +468,8 @@ configure_file("${PROJECT_SOURCE_DIR}/HyperionConfig.h.in" "${PROJECT_BINARY_DIR
include_directories("${PROJECT_BINARY_DIR}")
# Define the global output path of binaries
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
file(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH})
file(MAKE_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
@ -476,32 +482,21 @@ include_directories(${CMAKE_SOURCE_DIR}/include)
#set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so")
# MSVC options
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
# Search for Windows SDK
find_package(WindowsSDK REQUIRED)
message(STATUS "WINDOWS SDK: ${WINDOWSSDK_LATEST_DIR} ${WINDOWSSDK_LATEST_NAME}")
message(STATUS "MSVC VERSION: ${MSVC_VERSION}")
# Search for DirectX9
if (ENABLE_DX)
find_package(DirectX9 REQUIRED)
endif(ENABLE_DX)
endif()
# Use GNU gold linker if available
if (NOT WIN32 AND NOT APPLE)
include (${CMAKE_CURRENT_SOURCE_DIR}/cmake/LDGold.cmake)
endif()
# Don't create new dynamic tags (RUNPATH) and setup -rpath to search for shared libs in BINARY/../lib folder (only for Unix)
if (ENABLE_DEPLOY_DEPENDENCIES AND UNIX AND NOT APPLE)
if(ENABLE_DEPLOY_DEPENDENCIES AND UNIX AND NOT APPLE)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags")
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_RPATH}:$ORIGIN/../lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif ()
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif()
if(APPLE)
set(CMAKE_EXE_LINKER_FLAGS "-framework CoreGraphics")
@ -512,61 +507,61 @@ find_package(Threads REQUIRED)
# Allow to overwrite QT base directory
# Either supply QTDIR as -DQTDIR=<path> to cmake or set and environment variable QTDIR pointing to the Qt installation
# For Windows and OSX, the default Qt installation path are tried to resolved automatically
if (NOT DEFINED QTDIR)
if (DEFINED ENV{QTDIR})
if(NOT DEFINED QTDIR)
if(DEFINED ENV{QTDIR})
set(QTDIR $ENV{QTDIR})
else()
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
FIRSTSUBDIR(SUBDIRQT "C:/Qt")
if (NOT ${SUBDIRQT} STREQUAL "")
if(NOT ${SUBDIRQT} STREQUAL "")
set(QTDIR "${SUBDIRQT}/msvc2019_64")
endif()
elseif ( "${PLATFORM}" MATCHES "osx" )
# QT6 x86_64 location
if (EXISTS /usr/local/opt/qt6)
set(QTDIR "/usr/local/opt/qt6")
# QT6 arm64 location
elseif (EXISTS /opt/homebrew/opt/qt@6)
set(QTDIR "/opt/homebrew/opt/qt@6")
# QT5 x86_64 location
elseif (EXISTS /usr/local/opt/qt5)
set(QTDIR "/usr/local/opt/qt5")
# QT5 arm64 location
elseif (EXISTS /opt/homebrew/opt/qt@5)
set(QTDIR "/opt/homebrew/opt/qt@5")
endif()
elseif ("${PLATFORM}" MATCHES "osx")
foreach(QT_VERSION 6 5)
execute_process(
COMMAND brew --prefix qt@${QT_VERSION}
RESULT_VARIABLE DETECT_QT
OUTPUT_VARIABLE QT_LOCATION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(${DETECT_QT} EQUAL 0 AND EXISTS ${QT_LOCATION})
set(QTDIR ${QT_LOCATION})
break()
endif()
endforeach()
endif()
endif()
endif()
if (DEFINED QTDIR)
if(DEFINED QTDIR)
message(STATUS "Add QTDIR: ${QTDIR} to CMAKE_PREFIX_PATH")
list(PREPEND CMAKE_PREFIX_PATH ${QTDIR} "${QTDIR}/lib")
endif()
if (CMAKE_PREFIX_PATH)
message( STATUS "CMAKE_PREFIX_PATH used: ${CMAKE_PREFIX_PATH}" )
if(CMAKE_PREFIX_PATH)
message(STATUS "CMAKE_PREFIX_PATH used: ${CMAKE_PREFIX_PATH}")
endif()
# find QT libs
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network Sql Widgets REQUIRED)
message( STATUS "Found Qt Version: ${QT_VERSION}" )
message(STATUS "Found Qt Version: ${QT_VERSION}")
if (${QT_VERSION_MAJOR} GREATER_EQUAL 6 )
SET(QT_MIN_VERSION "6.2.2")
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
set(QT_MIN_VERSION "6.2.2")
else()
SET(QT_MIN_VERSION "5.5.0")
set(QT_MIN_VERSION "5.5.0")
endif()
if ( "${QT_VERSION}" VERSION_LESS "${QT_MIN_VERSION}" )
message( FATAL_ERROR "Your Qt version is to old! Minimum required ${QT_MIN_VERSION}" )
if("${QT_VERSION}" VERSION_LESS "${QT_MIN_VERSION}")
message(FATAL_ERROR "Your Qt version is to old! Minimum required ${QT_MIN_VERSION}")
endif()
find_package(Qt${QT_VERSION_MAJOR} ${QT_VERSION} COMPONENTS Core Gui Network Sql Widgets REQUIRED)
message( STATUS "Qt version used: ${QT_VERSION}" )
message(STATUS "Qt version used: ${QT_VERSION}")
if (APPLE AND (${QT_VERSION_MAJOR} GREATER_EQUAL 6) )
if(APPLE AND (${QT_VERSION_MAJOR} GREATER_EQUAL 6))
set(OPENSSL_ROOT_DIR /usr/local/opt/openssl)
endif()
@ -578,29 +573,29 @@ add_definitions(${QT_DEFINITIONS})
add_subdirectory(dependencies)
add_subdirectory(libsrc)
add_subdirectory(src)
if (ENABLE_TESTS)
if(ENABLE_TESTS)
add_subdirectory(test)
endif ()
endif()
# Add resources directory
add_subdirectory(resources)
# remove generated files on make cleaan too
LIST( APPEND GENERATED_QRC
list(APPEND GENERATED_QRC
${CMAKE_BINARY_DIR}/WebConfig.qrc
${CMAKE_BINARY_DIR}/HyperionConfig.h
)
if(ENABLE_EFFECTENGINE)
LIST( APPEND GENERATED_QRC
list(APPEND GENERATED_QRC
${CMAKE_BINARY_DIR}/EffectEngine.qrc
)
endif ()
endif()
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${GENERATED_QRC}" )
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${GENERATED_QRC}")
# uninstall target
configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
# enable make package - no code after this line !

View File

@ -124,8 +124,9 @@ The amount of "%" must match with following arguments
If you want to use VSCode for development follow the steps.
- Install [VSCode](https://code.visualstudio.com/). On Ubuntu 16.04+ you can also use the [Snapcraft VSCode](https://snapcraft.io/code) package.
- Linux: Install gdb `sudo apt-get install gdb`
- Mac: ?
- Install gdb:
- Linux: `sudo apt-get install gdb`
- Mac: `brew install gdb`
- Open VSCode and click on _File_ -> _Open Workspace_ and select the file `hyperion.ng/.vscode/hyperion.code-workspace`
- Install recommended extensions
- If you installed the Task Explorer you can now use the defined vscode tasks to build Hyperion and configure cmake

View File

@ -1,53 +0,0 @@
# Installation
This page contains general installation steps for Hyperion.
## Windows & macOS
For Windows and macOS is an installation file available on our [Release page](https://github.com/hyperion-project/hyperion.ng/releases).
## Linux:
On the following operating systems, Hyperion can currently be installed/updated using the method listed below:
- Raspbian Stretch/Raspberry Pi OS and later (armhf/arm64)
- Debian Stretch (9) and later (armhf/arm64/x86_64)
- Ubuntu 18.04 and later (armhf/arm64/x86_64)
***
### Install Hyperion:
1. Add necessary packages for the installation:
```bash
sudo apt-get update && sudo apt-get install wget gpg apt-transport-https lsb-release
```
2. Add Hyperions official GPG key:
```bash
wget -qO- https://apt.hyperion-project.org/hyperion.pub.key | sudo gpg --dearmor -o /usr/share/keyrings/hyperion.pub.gpg
```
3. Add Hyperion-Project to your APT sources:
```bash
echo "deb [signed-by=/usr/share/keyrings/hyperion.pub.gpg] https://apt.hyperion-project.org/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hyperion.list
```
4. Update your local package index and install Hyperion:
```bash
sudo apt-get update && sudo apt-get install hyperion
```
***
### Update Hyperion:
```bash
sudo apt-get install hyperion
```
***
### If you want to uninstall Hyperion, use the following commands:
1. Remove Hyperion:
```bash
sudo apt-get --purge autoremove hyperion
```
2. Remove the Hyperion-Project APT source from your system:
```bash
sudo rm /usr/share/keyrings/hyperion.pub.gpg /etc/apt/sources.list.d/hyperion.list
```

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2014-2023 Hyperion Project
Copyright (c) 2014-2024 Hyperion Project
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -5,11 +5,12 @@
</picture>
[![Latest-Release](https://img.shields.io/github/v/release/hyperion-project/hyperion.ng?include_prereleases&label=Latest%20Release&logo=github&logoColor=white&color=0f83e7)](https://github.com/hyperion-project/hyperion.ng/releases)
[![GitHub Actions](https://github.com/hyperion-project/hyperion.ng/workflows/Hyperion%20CI%20Build/badge.svg?branch=master)](https://github.com/hyperion-project/hyperion.ng/actions)
[![GitHub Actions](https://github.com/hyperion-project/hyperion.ng/actions/workflows/push_pull.yml/badge.svg)](https://github.com/hyperion-project/hyperion.ng/actions)
[![CodeQL Analysis](https://github.com/hyperion-project/hyperion.ng/actions/workflows/codeql.yml/badge.svg)](https://github.com/hyperion-project/hyperion.ng/actions/workflows/codeql.yml)
[![Forum](https://img.shields.io/website/https/hyperion-project.org.svg?label=Forum&down_color=red&down_message=offline&up_color=4bc51d&up_message=online&logo=homeadvisor&logoColor=white)](https://www.hyperion-project.org)
[![Documentation](https://img.shields.io/website/https/docs.hyperion-project.org.svg?label=Documentation&down_color=red&down_message=offline&up_color=4bc51d&up_message=online&logo=read-the-docs)](https://docs.hyperion-project.org)
[![Discord](https://img.shields.io/discord/785578322167463937?label=Discord&logo=discord&logoColor=white&color=4bc51d)](https://discord.gg/khkR8Vx3ff)
[![Discord](https://img.shields.io/discord/785578322167463937?label=Discord&logo=discord&logoColor=white&color=4bc51d)](https://discord.gg/XtVTb3HEKS)
[![Package-Repository](https://img.shields.io/badge/Package%20Repository-online-4bc51d?logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHdpZHRoPSIxMTZweCIgaGVpZ2h0PSIxMjNweCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij48cGF0aCBkPSJNNTUuNzYsNzcuMzlMMTcuMTUsNTcuMTNMNy4xOCw2OUMyMS4xOCw3Ni4zOCAzNC4wOCw4My4zNSA0OC4wNCw5MC43M0w1NS43Niw3Ny40NEw1NS43Niw3Ny4zOVpNNjguNDMsMEw2OC40MywyMS40NEw3OC40MywyMS40NEM3OS44MjQsMjEuMzYyIDgxLjE2NywyMS45OSA4MiwyMy4xMUM4My44NiwyNS45MSA4MS4zMSwyOC42OCA3OS41NSwzMC42MkM3NC41NSwzNi4xMyA2My4xOSw0OC40MiA2MC43MSw1MS4zMkM1OS45MzUsNTIuMzAyIDU4Ljc1MSw1Mi44NzUgNTcuNSw1Mi44NzVDNTYuMjQ5LDUyLjg3NSA1NS4wNjUsNTIuMzAyIDU0LjI5LDUxLjMyQzUxLjczLDQ4LjMyIDM5Ljc0LDM1LjQ2IDM0Ljk3LDMwLjA5QzMzLjMyLDI4LjIzIDMxLjI3LDI1LjY5IDMyLjk3LDIzLjA5QzMzLjgwMSwyMS45NzMgMzUuMTQsMjEuMzQ1IDM2LjUzLDIxLjQyTDQ2LjUzLDIxLjQyTDQ2LjUzLDBMNjguNDMsMFpNMzUuNDMsNDYuMzRMMTkuNzcsNTQuMTJMNTguMjYsNzQuMzVMOTYuODIsNTQuMDhMODAuMjgsNDUuNDhMODIuOTgsNDIuNDhMOTcuOTgsNTAuMjJMMTA4Ljg1LDQwTDkyLjM2LDMxQzkyLjk5NCwyOS43NDUgOTMuNDEzLDI4LjM5MyA5My42LDI3TDExNC4yMywzNy45QzExNC4zNjUsMzcuOTcyIDExNC40ODcsMzguMDY3IDExNC41OSwzOC4xOEMxMTQuODY2LDM4LjQ1NiAxMTUuMDIxLDM4LjgzIDExNS4wMjEsMzkuMjJDMTE1LjAyMSwzOS42MSAxMTQuODY2LDM5Ljk4NCAxMTQuNTksNDAuMjZMMTAxLjM0LDUzLjI2TDExNC4xNyw2OC42MkMxMTQuNjksNjkuMjQ0IDExNC42MDksNzAuMTg0IDExMy45OSw3MC43MUMxMTMuODk1LDcwLjc4IDExMy43OTQsNzAuODQ0IDExMy42OSw3MC45TDEwMi4xNCw3N0wxMDIuMTQsOTkuODhDMTAyLjEzOSwxMDAuNDc3IDEwMS43OCwxMDEuMDE4IDEwMS4yMywxMDEuMjVMNTkuNTcsMTIyLjM5QzU5LjI5LDEyMi43IDU4Ljg5MSwxMjIuODc3IDU4LjQ3MywxMjIuODc3QzU3LjkxNCwxMjIuODc3IDU3LjQwMSwxMjIuNTYgNTcuMTUsMTIyLjA2TDE1LjQxLDEwMS4yQzE0LjkxNCwxMDAuOTQ4IDE0LjYsMTAwLjQzNyAxNC42LDk5Ljg4TDE0LjYsNzcuMTZMMi44NSw3MUMyLjc0Niw3MC45NDQgMi42NDUsNzAuODggMi41NSw3MC44MUMxLjkzMSw3MC4yODQgMS44NSw2OS4zNDQgMi4zNyw2OC43MkwxNC44Nyw1My43MkwwLjM2LDQwQzAuMTE3LDM5LjcyNyAtMC4wMTcsMzkuMzc0IC0wLjAxNywzOS4wMDlDLTAuMDE3LDM4LjU3NSAwLjE3MiwzOC4xNjMgMC41LDM3Ljg4QzAuNTksMzcuODA4IDAuNjg3LDM3Ljc0NCAwLjc5LDM3LjY5TDIxLjczLDI1Ljg0QzIxLjgyNywyNy4yODcgMjIuMTM0LDI4LjcxMSAyMi42NCwzMC4wN0w1LjY5LDM5LjcxTDE3LjUyLDUwLjcxTDMyLjYxLDQzLjI0TDM1LjQ2LDQ2LjM1TDM1LjQzLDQ2LjM0Wk05OS41OSw1Ny4yOEw2MS4wNSw3Ny41TDY4LjU2LDkwLjgyTDEwOS4xMSw2OC44Mkw5OS41OSw1Ny4yOFoiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPjwvc3ZnPg==)](https://releases.hyperion-project.org)
![made-with-love](https://img.shields.io/badge/Made%20With-&#9829;-ff0000.svg)
## About Hyperion
@ -45,7 +46,7 @@ For an example, you can participate in the translation.<br>
## Supported Platforms
Find here more details on [supported platforms and configuration sets](doc/development/SupportedPlatforms.md)
Find here more details on [supported platforms and configuration sets](doc/development/SupportedPlatforms.md).
## Documentation
Covers these topics:
@ -57,16 +58,16 @@ Covers these topics:
[![Visit Documentation](https://img.shields.io/website/https/docs.hyperion-project.org.svg?label=Documentation&down_color=red&down_message=offline&up_color=4bc51d&up_message=online&logo=read-the-docs)](https://docs.hyperion-project.org)
## Changelog
Released and unreleased changes at [CHANGELOG.md](CHANGELOG.md)
Released and unreleased changes at [CHANGELOG.md](CHANGELOG.md).
## Building
See [CompileHowto.md](doc/development/CompileHowto.md).
## Installation
See [Documentation](https://docs.hyperion-project.org/en/user/Installation.html) or at [Installation.md](Installation.md).
See [Documentation](https://docs.hyperion-project.org/en/user/Installation.html) or on the [Release Repository](https://releases.hyperion-project.org).
## Download
Releases available from the [Hyperion release page](https://github.com/hyperion-project/hyperion.ng/releases)
GitHub Releases are available on the [Hyperion release page](https://github.com/hyperion-project/hyperion.ng/releases).
## Privacy Policy
See [PRIVACY.md](PRIVACY.md).

View File

@ -0,0 +1,11 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-server fa-fw"></i><span data-i18n="main_menu_events">Event Services</span></h3>
<div id="conf_cont">
</div>
</div>
</div>
</div>
<script src="/js/content_events.js"></script>

View File

@ -28,17 +28,20 @@
</div>
</div>
</div>
<div class="col-lg-6" id="conf_imp">
<div class="panel panel-default">
<div class="panel-heading"><i class="fa fa-wrench fa-fw"></i><span data-i18n="conf_general_impexp_title"></span></div>
<div class="panel-body">
<p data-i18n="conf_general_impexp_l1" style="font-weight:bold"></p>
<p data-i18n="conf_general_impexp_l2" style="font-weight:bold"></p>
<input type="file" id="select_import_conf" accept=".json">
</div>
<div class="panel-footer" style="text-align:right">
<button type="file" class="btn btn-primary" id="btn_import_conf" data-i18n="conf_general_impexp_impbtn" disabled>Import</button>
<button class="btn btn-primary" id="btn_export_conf" data-i18n="conf_general_impexp_expbtn">Export</button>
<!-- Instance(s) -->
<div class="row instances">
<div class="col-lg-6" id="conf_imp">
<div class="panel panel-default">
<div class="panel-heading"><i class="fa fa-wrench fa-fw"></i><span data-i18n="conf_general_impexp_title"></span></div>
<div class="panel-body">
<p data-i18n="conf_general_impexp_l1" style="font-weight:bold"></p>
<p data-i18n="conf_general_impexp_l2" style="font-weight:bold"></p>
<input type="file" id="select_import_conf" accept=".json">
</div>
<div class="panel-footer" style="text-align:right">
<button type="file" class="btn btn-primary" id="btn_import_conf" data-i18n="conf_general_impexp_impbtn" disabled>Import</button>
<button class="btn btn-primary" id="btn_export_conf" data-i18n="conf_general_impexp_expbtn">Export</button>
</div>
</div>
</div>
</div>
@ -48,3 +51,4 @@
</div>
<script src="/js/content_general.js"></script>

View File

@ -46,6 +46,9 @@
</div>
</div>
<div class="panel-footer" style="text-align:right">
<button id='btn_layout_controller' class="btn btn-primary" disabled data-toggle="tooltip" data-placement="top" title="Generate a layout for the configured device">
<i class="fa fa-fw fa-save"></i><span data-i18n="wiz_layout">Generate Layout</span>
</button>
<button id='btn_test_controller' class="btn btn-primary" disabled data-toggle="tooltip" data-placement="top" title="Identify configured device by lighting it up">
<i class="fa fa-fw fa-save"></i><span data-i18n="wiz_identify">Identify/Test</span>
</button>
@ -324,7 +327,7 @@
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_direction" data-i18n="conf_leds_layout_ma_direction">Cabling</label>
<label class="ltdlabel" for="ip_ma_direction" data-i18n="conf_leds_layout_ma_direction">Direction</label>
</td>
<td class="itd">
<select class="form-control ledMAconstr" id="ip_ma_direction">
@ -349,6 +352,61 @@
</tbody>
</table>
</div>
<div class="panel panel-default">
<div class="panel-heading headcollapse" data-toggle="collapse" data-target="#collapse-maadv" id="ma_advanced_settings">
<h4 class="panel-title">
<a>
<i class="fa fa-fw fa-cogs"></i>
<span data-i18n="conf_leds_layout_advanced">Advanced settings</span>
<i class="fa fa-angle-down pull-right" id="ma_advanced_settings_right_icon"></i>
</a>
</h4>
</div>
<div id="collapse-maadv" class="panel-collapse collapse">
<div class="panel-body ">
<table class="tableform borderless">
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_gapleft" data-i18n="conf_leds_layout_gapleft">Gap Left</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_gapleft" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%h</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_gapright" data-i18n="conf_leds_layout_gapright">Gap Right</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_gapright" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%v</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_gaptop" data-i18n="conf_leds_layout_gaptop">Gap Left</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_gaptop" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%h</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_gapbottom" data-i18n="conf_leds_layout_gapbottom">Gap Right</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_gapbottom" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%v</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="panel-footer" style="text-align:right;">
<button id="btn_ma_save" class="btn btn-primary"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>

View File

@ -1,68 +1,70 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-download fa-fw"></i><span data-i18n="main_menu_update_token">Update</span></h3>
<div class="introd">
<h4 data-i18n="update_label_intro">Overview about all available Hyperion versions. On top you could update or downgrade your version of Hyperion whenever you want. Sorted from newest to oldest</h4>
<h4> At the moment the respective install button is disabled. Development is still ongoing here. </h4>
<hr />
</div>
<h4 id="update_currver"></h4>
<hr>
<div class="col-lg-12" id="versionlist">
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-download fa-fw"></i><span data-i18n="main_menu_update_token">Update</span></h3>
<div class="introd">
<h4 data-i18n="update_label_intro">Overview about all available Hyperion versions. On top you could update or downgrade your version of Hyperion whenever you want. Sorted from newest to oldest</h4>
<h4> At the moment the respective install button is disabled. Development is still ongoing here. </h4>
<hr />
</div>
<h4 id="update_currver"></h4>
<hr>
<div class="col-lg-12" id="versionlist">
</div>
</div>
</div>
</div>
<script>
$(document).ready( function(error) {
performTranslation();
getReleases(function (callback){
$(document).ready(function (error) {
performTranslation();
getReleases(function (callback) {
if(callback)
{
var matches = 0;
for (var key in window.gitHubVersionList)
{
if (callback) {
var matches = 0;
for (var key in window.gitHubVersionList) {
if(window.gitHubVersionList[key].name == null || window.gitHubVersionList[key].tag_name.includes('rc') || (window.serverConfig.general.watchedVersionBranch == "Stable" && (window.gitHubVersionList[key].tag_name.includes('beta') || window.gitHubVersionList[key].tag_name.includes('alpha'))) || (window.serverConfig.general.watchedVersionBranch == "Beta" && window.gitHubVersionList[key].tag_name.includes('alpha')))
{
continue;
}
var danger;
var type;
if (window.gitHubVersionList[key].name == null ||
window.gitHubVersionList[key].tag_name.includes('rc') ||
(window.serverConfig.general.watchedVersionBranch == "Stable" &&
(window.gitHubVersionList[key].tag_name.includes('beta') ||
window.gitHubVersionList[key].tag_name.includes('alpha')
)
) ||
(window.serverConfig.general.watchedVersionBranch == "Beta"
&& window.gitHubVersionList[key].tag_name.includes('Alpha')
)) {
continue;
}
if (window.gitHubVersionList[key].tag_name.includes('beta'))
{
danger = 'warning';
type = 'Beta';
}
else if (window.gitHubVersionList[key].tag_name.includes('alpha'))
{
danger = 'danger';
type = 'Alpha';
}
else
{
danger = 'default';
type = 'Stable';
}
var danger;
var type;
matches++;
$('#versionlist').append('<div class="col-lg-6"><div class="panel panel-'+ danger +'"><div class="panel-heading"><i class="fa fa-television fa-fw"></i>Hyperion V'+window.gitHubVersionList[key].tag_name+'</div><div class="panel-body"><p><span style="font-weight:bold;">'+$.i18n('update_label_type') + '</span> ' + type + '</p><p><span id="desc" style="font-weight:bold;">'+$.i18n('update_label_description')+'</span> '+DOMPurify.sanitize(marked.parse(window.gitHubVersionList[key].body))+'</p><hr><a class="btn btn-primary" href="'+ window.gitHubVersionList[key].html_url +'" target="_blank"><i class="fa fa-list fa-fw"></i><span style="font-weight:bold;">'+$.i18n('update_button_changelog')+'</span></a><button type="button" class="btn btn-warning pull-right" ' + (window.gitHubVersionList[key].tag_name == window.currentVersion ? "disabled":"disabled") + '><i class="fa fa-download fa-fw"></i>'+$.i18n('update_button_install')+'</button></div></div></div>');
}
$('#update_currver').append($.i18n('update_versreminder', currentVersion));
if (window.gitHubVersionList[key].tag_name.includes('beta')) {
danger = 'warning';
type = 'Beta';
}
else if (window.gitHubVersionList[key].tag_name.includes('alpha')) {
danger = 'danger';
type = 'Alpha';
}
else {
danger = 'default';
type = 'Stable';
}
if (matches == 0)
$('#versionlist').append($.i18n('update_no_updates_for_branch'));
}
else
{
$('#versionlist').append($.i18n('update_error_getting_versions'));
}
});
removeOverlay();
});
matches++;
$('#versionlist').append('<div class="col-lg-6"><div class="panel panel-' + danger + '"><div class="panel-heading"><i class="fa fa-television fa-fw"></i>Hyperion V' + window.gitHubVersionList[key].tag_name + '</div><div class="panel-body"><p><span style="font-weight:bold;">' + $.i18n('update_label_type') + '</span> ' + type + '</p><p><span id="desc" style="font-weight:bold;">' + $.i18n('update_label_description') + '</span> ' + DOMPurify.sanitize(marked.parse(window.gitHubVersionList[key].body)) + '</p><hr><a class="btn btn-primary" href="' + window.gitHubVersionList[key].html_url + '" target="_blank"><i class="fa fa-list fa-fw"></i><span style="font-weight:bold;">' + $.i18n('update_button_changelog') + '</span></a><button type="button" class="btn btn-warning pull-right" ' + (window.gitHubVersionList[key].tag_name == window.currentVersion ? "disabled" : "disabled") + '><i class="fa fa-download fa-fw"></i>' + $.i18n('update_button_install') + '</button></div></div></div>');
}
$('#update_currver').append($.i18n('update_versreminder', currentVersion));
if (matches == 0)
$('#versionlist').append($.i18n('update_no_updates_for_branch'));
}
else {
$('#versionlist').append($.i18n('update_error_getting_versions'));
}
});
removeOverlay();
});
</script>

View File

@ -0,0 +1,93 @@
{
"conf_effect_path_intro": "Заредете ефекти от дефинираните пътища. Освен това можете да деактивирате отделни ефекти по име, за да ги скриете от всички списъци с ефекти.",
"conf_general_impexp_expbtn": "Експортиране",
"conf_general_impexp_impbtn": "Импортиране",
"conf_general_impexp_l1": "Импортирайте конфигурация, като изберете конфигурационен файл по-долу и щракнете върху „Импортиране“.",
"conf_general_impexp_l2": "Експортирайте конфигурация, като щракнете върху „Експортиране“. Вашият браузър започва изтегляне.",
"conf_general_impexp_title": "Импортиране/Експортиране на Конфигурация",
"conf_general_intro": "Основни настройки около Hyperion и WebUI, които не се вписват в друга категория.",
"conf_general_label_title": "Общи настройки",
"conf_helptable_expl": "Обяснение",
"conf_helptable_option": "Опции",
"conf_leds_layout_checkp1": "Черният светодиод е вашият първи светодиод, първият светодиод е точката, в която въвеждате вашия сигнал с данни.",
"conf_leds_layout_checkp2": "Оформлението винаги е изгледът отпред на вашия телевизор, никога отзад.",
"conf_leds_layout_checkp3": "Уверете се, че посоката е правилна. Сивите светодиоди показват светодиод номер 2 и 3 за визуализиране на посоката на данните.",
"conf_leds_optgroup_network": "Мрежа",
"dashboard_alert_message_confedit": "Вашата конфигурация на Hyperion е променена. За да го приложите, рестартирайте Hyperion.",
"dashboard_alert_message_confedit_t": "Конфигурацията е променена",
"dashboard_alert_message_confsave_success": "Вашата конфигурация на Hyperion е запазена успешно. Вашите промени вече са активни.",
"dashboard_alert_message_confsave_success_t": "Конфигурацията е запаметена",
"dashboard_alert_message_disabled": "Тази инстанция в момента е деактивирана! За да я използвате отново, активирайте я на таблото за управление.",
"dashboard_alert_message_disabled_t": "ЛЕД хардуерна инстанция е деактивирана",
"dashboard_componentbox_label_comp": "Компонент",
"dashboard_componentbox_label_status": "Статус",
"dashboard_componentbox_label_title": "Статус на компонентите",
"dashboard_infobox_label_currenthyp": "Вашата версия на Hyperion:",
"dashboard_infobox_label_instance": "Инстанция:",
"dashboard_infobox_label_latesthyp": "Последната версия на Hyperion:",
"dashboard_infobox_label_platform": "Платформа:",
"dashboard_infobox_label_ports": "Портове",
"dashboard_infobox_label_statush": "Hyperion статус:",
"dashboard_infobox_label_title": "Информация",
"dashboard_infobox_message_updatesuccess": "Вие използвате най-новата версия на Hyperion.",
"dashboard_infobox_message_updatewarning": "Нова версия на Hyperion е налична! ($1)",
"dashboard_newsbox_label_title": "Hyperion-Блог",
"dashboard_newsbox_noconn": "Не можете да се свържете с Hyperion Server, за да извлечете най-новите публикации, вашата интернет връзка работи ли?",
"dashboard_newsbox_readmore": "Прочети повече",
"dashboard_newsbox_visitblog": "Посети Hyperion-Блог",
"edt_conf_webc_port_title": "HTTP порт",
"general_access_default": "По подразбиране",
"general_btn_back": "Назад",
"general_btn_cancel": "Откажи",
"general_btn_continue": "Продължи",
"general_btn_next": "Следващ",
"general_btn_off": "Изключване",
"general_btn_ok": "ОК",
"general_btn_on": "Включване",
"general_btn_restarthyperion": "Рестартирай Hyperion",
"general_btn_save": "Запази",
"general_btn_saveandreload": "Запази и презареди",
"general_btn_yes": "Да",
"general_button_savesettings": "Запази настройките",
"general_col_blue": "синьо",
"general_col_green": "зелено",
"general_col_red": "червено",
"general_comp_LEDDEVICE": "ЛЕД Изход",
"general_country_de": "Германия",
"general_country_es": "Испания",
"general_country_fr": "Франция",
"general_country_it": "Италия",
"general_country_nl": "Холандия",
"general_country_uk": "Англия",
"general_country_us": "САЩ",
"general_speech_cs": "Чешки",
"general_speech_de": "Немски",
"general_speech_en": "Английски",
"general_speech_es": "Испански",
"general_speech_he": "Иврит",
"general_speech_id": "Индонезийски",
"general_speech_it": "Италиански",
"general_speech_uk": "Украински",
"general_webui_title": "Hyperion - Уеб Конфигурация",
"main_ledsim_btn_togglelednumber": "Брой ЛЕД",
"main_ledsim_btn_toggleleds": "Показване на светодиоди",
"main_ledsim_btn_togglelivevideo": "Видео на живо",
"main_ledsim_text": "Визуализация на живо на LED цветове и по избор текущия видео поток на вашето устройство за прихващане.",
"main_ledsim_title": "ЛЕД Визуализация",
"main_menu_about_token": "Относно Hyperion",
"main_menu_colors_conf_token": "Обработка на изображение",
"main_menu_configuration_token": "ЛЕД Инстанции",
"main_menu_dashboard_token": "Табло за управление",
"main_menu_effect_conf_token": "Ефекти",
"main_menu_effectsconfigurator_token": "Конфигуратор на ефекти",
"main_menu_general_conf_token": "Общи",
"main_menu_input_selection_token": "Ибор на вход",
"main_menu_leds_conf_token": "ЛЕД Изход",
"main_menu_logging_token": "Дневник",
"main_menu_network_conf_token": "Мрежови услуги",
"main_menu_remotecontrol_token": "Дистанционно управление",
"main_menu_support_token": "Поддръжка",
"main_menu_system_token": "Система",
"main_menu_update_token": "Актуализация",
"main_menu_webconfig_token": "Уеб конфигурация"
}

View File

@ -54,6 +54,8 @@
"conf_leds_layout_checkp3": "Ujistěte se, že směr je správný. Šedé LED diody (čislo 2. a 3.) zobrazuji směr dat.",
"conf_leds_layout_checkp4": "Spodní mezera: Chcete-li vytvořit mezeru, nejprve ji ignorujte a nastavte horní / dolní / levou a pravou hranu. Následně nastavte délku mezery, tím se odstraní požadované množství LED. Pak upravte polohu mezery, dokud nebude na správném místě.",
"conf_leds_layout_cl_bottom": "Spodní",
"conf_leds_layout_cl_bottomleft": "Levý dolní",
"conf_leds_layout_cl_bottomright": "Pravý dolní",
"conf_leds_layout_cl_cornergap": "Mezera od rohu",
"conf_leds_layout_cl_edgegap": "Mezera od hrany",
"conf_leds_layout_cl_gaglength": "Délka mezery",
@ -61,10 +63,18 @@
"conf_leds_layout_cl_hleddepth": "Horizontální hloubka LED",
"conf_leds_layout_cl_inppos": "Vstupní pozice",
"conf_leds_layout_cl_left": "Vlevo",
"conf_leds_layout_cl_leftbottom": "V levo 50% - 100% dole",
"conf_leds_layout_cl_leftmiddle": "V levo 25% - 75% střed",
"conf_leds_layout_cl_lefttop": "V levo 0% - 50% nahoře",
"conf_leds_layout_cl_overlap": "Překrytí",
"conf_leds_layout_cl_reversdir": "Opačný směr",
"conf_leds_layout_cl_right": "Vpravo",
"conf_leds_layout_cl_rightbottom": "V pravo 50% - 100% dole",
"conf_leds_layout_cl_rightmiddle": "V pravo 25% - 75% střed",
"conf_leds_layout_cl_righttop": "V pravo 0% - 50% nahoře",
"conf_leds_layout_cl_top": "Horní",
"conf_leds_layout_cl_topleft": "Levý horní",
"conf_leds_layout_cl_topright": "Pravý horní",
"conf_leds_layout_cl_vleddepth": "Vertikální hloubka LED",
"conf_leds_layout_frame": "Klasické uspořádání (rám LED)\n",
"conf_leds_layout_generatedconf": "Konfigurace generovaných / současných LED",
@ -98,7 +108,7 @@
"conf_leds_optgroup_RPiPWM": "RPi PWM",
"conf_leds_optgroup_RPiSPI": "RPi SPI\n",
"conf_leds_optgroup_network": "Síť",
"conf_leds_optgroup_usb": "USB",
"conf_leds_optgroup_usb": "USB/Serial",
"conf_logging_btn_autoscroll": "Automatické posouvání",
"conf_logging_btn_pbupload": "Odeslat hlášení pro žádost o podporu",
"conf_logging_contpolicy": "Nahlásit zásady ochrany osobních údajů",
@ -122,12 +132,14 @@
"conf_network_tok_desc": "Tokeny udělují dalším aplikacím přístup k rozhraní API Hyperion, aplikace si může vyžádat token, který budete muset přijmout, nebo si je můžete sami vytvořit níže. Tyto tokeny jsou vyžadovány, pokud je v nastavení sítě povoleno „Autorizace API“.",
"conf_network_tok_diaMsg": "Zde je váš nový token, který lze použít k udělení přístupu aplikace k rozhraní Hyperion API. Z bezpečnostních důvodů ji již nelze znovu zobrazit, proto ji použijte nebo zapište.",
"conf_network_tok_diaTitle": "Byl vytvořen nový token!",
"conf_network_tok_grantMsg": "App vyžaduje token pro přístup k Hyperion API. Chcete povolit přístup? Prosím potvrďte uvedené informace!",
"conf_network_tok_grantT": "App vyžaduje Token",
"conf_network_tok_intro": "Zde můžete vytvářet a mazat tokeny pro autentizaci pomocí API. Vytvořené tokeny se zobrazí pouze jednou.",
"conf_network_tok_lastuse": "Poslední použití",
"conf_network_tok_title": "Správa tokenů",
"conf_webconfig_label_intro": "Nastavení webové konfigurace. Editujte opatrně.",
"dashboard_active_instance": "Vybraná instance",
"dashboard_alert_message_confedit": "Vaše konfigurace Hyperionu byla upravena. Chcete-li jej použít, restartujte službu Hyperion.",
"dashboard_alert_message_confedit": "Vaše konfigurace Hyperionu byla upravena. Chcete-li jej použít, restartujte Hyperion.",
"dashboard_alert_message_confedit_t": "Konfigurace byla změněna",
"dashboard_alert_message_confsave_success": "Vaše konfigurace Hyperion byla úspěšně uložena. Vaše změny jsou nyní aktivní.",
"dashboard_alert_message_confsave_success_t": "Konfigurace uložena",
@ -137,25 +149,25 @@
"dashboard_componentbox_label_status": "Status",
"dashboard_componentbox_label_title": "Stav komponent",
"dashboard_infobox_label_currenthyp": "Vaše verze Hyperionu",
"dashboard_infobox_label_disableh": "Vypnout Instance: $1",
"dashboard_infobox_label_disableh": "Vypnout Instanci: $1",
"dashboard_infobox_label_enableh": "Zapnout Instance: $1",
"dashboard_infobox_label_instance": "Instance:",
"dashboard_infobox_label_latesthyp": "Poslední dostupná verze Hyperionu",
"dashboard_infobox_label_platform": "Platforma:",
"dashboard_infobox_label_ports": "Port",
"dashboard_infobox_label_ports": "Porty",
"dashboard_infobox_label_smartacc": "Inteligentní přístup",
"dashboard_infobox_label_statush": "Stav Hyperionu:",
"dashboard_infobox_label_title": "Informace",
"dashboard_infobox_label_watchedversionbranch": "Sledovaná větev verze:",
"dashboard_infobox_message_updatesuccess": "Spusťte nejnovější verzi Hyperionu.",
"dashboard_infobox_message_updatesuccess": "Používáte nejnovější verzi Hyperionu.",
"dashboard_infobox_message_updatewarning": "Je k dispozici novější verze Hyperionu! ($1)",
"dashboard_label_intro": "Tento řídicí panel poskytuje rychlý přehled o instalaci Hyperionu a zobrazuje nejnovější zprávy z blogu Hyperion.",
"dashboard_label_intro": "Tento řídicí panel poskytuje rychlý přehled o stavu Hyperionu",
"dashboard_message_default_password": "Je nastaveno výchozí heslo pro WebUi. Důrazně doporučujeme ho změnit.",
"dashboard_message_default_password_t": "Je nastaveno výchozí heslo pro WebUi",
"dashboard_message_global_setting": "Nastavení na této stránce nezávisí na konkrétní instanci. Změny budou uloženy globálně pro všechny instance.",
"dashboard_message_global_setting_t": "Nastavení nezávislé na instanci",
"dashboard_newsbox_label_title": "Hyperion-Blog",
"dashboard_newsbox_noconn": "Nemůžete se připojit k blogu Hyperion a načíst nejnovější příspěvky, funguje vaše připojení k internetu?",
"dashboard_newsbox_noconn": "Nelze se připojit serveru Hyperion a načíst nejnovější příspěvky, funguje vaše připojení k internetu?",
"dashboard_newsbox_readmore": "Čtěte víc",
"dashboard_newsbox_visitblog": "Navštivte Hyperion-Blog",
"edt_append_degree": "°",
@ -376,7 +388,6 @@
"edt_conf_webc_keyPath_title": "Cesta soukromého klíče",
"edt_conf_webc_sslport_expl": "Port webového serveru HTTPS",
"edt_conf_webc_sslport_title": "HTTPS Port\n",
"edt_dev_auth_key_title": "Ověřovací token",
"edt_dev_enum_sub_min_cool_adjust": "Teplota barvy: cool",
"edt_dev_enum_sub_min_warm_adjust": "Teplota barvy: warm",
"edt_dev_enum_subtract_minimum": "Odčtěte minimum",
@ -601,6 +612,8 @@
"general_btn_cancel": "Zrušit",
"general_btn_continue": "Pokračovat",
"general_btn_delete": "Smazat",
"general_btn_denyAccess": "Zakázat přístup",
"general_btn_grantAccess": "Povolit přistup",
"general_btn_iswitch": "Přepnout",
"general_btn_next": "Další",
"general_btn_off": "Vypnout",
@ -610,6 +623,7 @@
"general_btn_restarthyperion": "Restartovat Hyperion",
"general_btn_save": "Uložit",
"general_btn_saveandreload": "Uložit a načíst",
"general_btn_saverestart": "Uložit a restartovat",
"general_btn_start": "Start\n",
"general_btn_stop": "Stop",
"general_btn_yes": "Ano",
@ -623,8 +637,8 @@
"general_comp_FLATBUFSERVER": "Flatbuffers Server",
"general_comp_FORWARDER": "Zasílat",
"general_comp_GRABBER": "Sn",
"general_comp_LEDDEVICE": "LED zařízení",
"general_comp_PROTOSERVER": "Protokol vyrovnávací paměti severu",
"general_comp_LEDDEVICE": "LED výstup",
"general_comp_PROTOSERVER": "Server vyrovnávací paměti",
"general_comp_SMOOTHING": "Vyhlazení",
"general_comp_V4L": "USB snímač",
"general_country_de": "Německo",
@ -686,7 +700,7 @@
"main_menu_general_conf_token": "Obecná",
"main_menu_grabber_conf_token": "Zachytávací zařizení",
"main_menu_input_selection_token": "Volba vstupu",
"main_menu_leds_conf_token": "LED Zařizení",
"main_menu_leds_conf_token": "LED výstup",
"main_menu_logging_token": "Log",
"main_menu_network_conf_token": "Síťové nastavení",
"main_menu_remotecontrol_token": "Dálkové ovládání",
@ -781,10 +795,12 @@
"wiz_cc_testintrowok": "Následující odkaz je ke stažení testovacích videí:",
"wiz_cc_title": "Průvodce kalibrací barev",
"wiz_guideyou": "$1 vás provede nastavením. Stačí stisknout tlačítko!",
"wiz_hue_blinkblue": "Nechte ID $1 svítit modře",
"wiz_hue_clientkey": "Klíč",
"wiz_hue_create_user": "Vytvořit nového uživatele",
"wiz_hue_desc1": "Automaticky prohledává Hue Bridge, v případě, že jej nenajde, musíte ručně zadat adresu IP a stisknout tlačítko pro opětné načtení vpravo. Nyní potřebujete ID uživatele, pokud nemáte, vytvořte nový.",
"wiz_hue_desc2": "Nyní zvolte, které lampy by měly být přidány. Poloha přiřadí lampu na určitou pozici na \"obrázku\". Deaktivované lampy nebudou přidány. Chcete-li identifikovat jednotlivé lampy, stiskněte tlačítko vpravo.",
"wiz_hue_e_create_user": "Vytvořit nového uživatele a klíče",
"wiz_hue_e_use_groupid": "Použít skupinu ID 1$",
"wiz_hue_failure_connection": "Časový limit: Stiskněte tlačítko Bridge v průběhu 30 sekund",
"wiz_hue_failure_ip": "Žádný Bridge nebyl nalezen, zadejte prosím platnou IP adresu",
"wiz_hue_failure_user": "Uživatel nebyl nalezen, vytvořte nový pomocí tlačítka níže nebo zadejte platné ID uživatele a stiskněte symbol „znovu načíst“.",

View File

@ -22,6 +22,8 @@
"about_resources": "$1 Bibliotheken",
"about_translations": "Übersetzungen",
"about_version": "Version",
"conf_cec_events_heading_title": "CEC Ereignisse",
"conf_cec_events_intro": "Einstellungen für verschiedene CEC-Protokoll-Ereignisse (Consumer Electronics Control), die Hyperion verarbeiten kann",
"conf_colors_blackborder_intro": "Ignoriere schwarze Balken, jeder Modus nutzt einen anderen Algorithmus, um diese zu erkennen. Erhöhe die Schwelle, sollte es nicht funktionieren.",
"conf_colors_color_intro": "Erstelle Kalibrierungsprofile die einzelnen Komponenten zugewiesen werden können. Passe dabei Farben, Gamma, Helligkeit, Kompensation und mehr an.",
"conf_colors_smoothing_intro": "Glätte den Farbverlauf und Helligkeitsänderungen um nicht von schnellen Übergängen abgelenkt zu werden.",
@ -82,6 +84,8 @@
"conf_leds_layout_cl_bottomright": "Unten Rechts (Ecke)",
"conf_leds_layout_cl_cornergap": "Eckabstand",
"conf_leds_layout_cl_edgegap": "Eckenabstand",
"conf_leds_layout_cl_entertainment": "\nEntertainment Bereich",
"conf_leds_layout_cl_entertainment_center": "\nEntertainment Bereich Mitte",
"conf_leds_layout_cl_gaglength": "Lückenlänge",
"conf_leds_layout_cl_gappos": "Lückenposition",
"conf_leds_layout_cl_hleddepth": "Horizontale LED-Tiefe",
@ -111,7 +115,13 @@
"conf_leds_layout_cl_topright": "Oben Rechts (Ecke)",
"conf_leds_layout_cl_vleddepth": "Vertikale LED-Tiefe",
"conf_leds_layout_frame": "Klassisches Layout (Rahmen)",
"conf_leds_layout_gapbottom": "Abstand von unten",
"conf_leds_layout_gapleft": "Abstand von links",
"conf_leds_layout_gapright": "Abstand von rechts",
"conf_leds_layout_gaptop": "Abstand von oben",
"conf_leds_layout_generatedconf": "Generierte/Aktuelle LED-Konfiguration",
"conf_leds_layout_generation_error": "LED Layout wurde nicht erzeugt",
"conf_leds_layout_generation_success": "LED-Layout erfolgreich erstellt",
"conf_leds_layout_intro": "Du benötigst ebenfalls ein LED-Layout, welches deine LED-Positionen widerspiegelt. Das klassische Layout wird üblicherweise für TVs verwendet, Hyperion unterstützt aber auch LED-Wände (Matrix). Die Ansicht des Layouts ist die Perspektive VOR dem Fernseher, nicht dahinter.",
"conf_leds_layout_ma_cabling": "Verkabelung",
"conf_leds_layout_ma_direction": "Richtung",
@ -184,6 +194,10 @@
"conf_network_tok_intro": "Hier kannst du Token zur API-Authentifizierung erstellen oder löschen. Neu erstellte Token werden einmalig angezeigt.",
"conf_network_tok_lastuse": "Zuletzt genutzt",
"conf_network_tok_title": "Token Management",
"conf_os_events_heading_title": "Betriebssystemereignisse",
"conf_os_events_intro": "Einstellungen in Bezug auf verschiedene Betriebssystemereignisse, die Hyperion verarbeiten kann",
"conf_sched_events_heading_title": "Zeitliche Ereignisse",
"conf_sched_events_intro": "Einstellungen in Bezug auf geplante, d. h. zeitbasierte Ereignisse, die von Hyperion verarbeitet werden",
"conf_webconfig_label_intro": "Einstellungen zur Webkonfiguration. Änderungen können die Erreichbarkeit des Webinterfaces beeinflussen.",
"dashboard_active_instance": "Ausgewählte Instanz",
"dashboard_alert_message_confedit": "Deine Hyperion Konfiguration wurde verändert. Um die Änderungen anzuwenden, starte Hyperion neu.",
@ -235,6 +249,9 @@
"edt_append_pixel": "Pixel",
"edt_append_s": "s",
"edt_append_sdegree": "s/grad",
"edt_conf_action_expl": "Auszuführende Aktion",
"edt_conf_action_record_validation_error": "Ein und dasselbe Ereignis kann nur eine Aktion auslösen. Bereinige Aktionen $1",
"edt_conf_action_title": "Aktion",
"edt_conf_audio_device_expl": "Ausgewähltes Audio-Eingabegerät",
"edt_conf_audio_device_title": "Audio-Eingabegerät",
"edt_conf_audio_effect_enum_vumeter": "VU-Meter",
@ -271,6 +288,17 @@
"edt_conf_bb_unknownFrameCnt_title": "Unbekannte Bilder",
"edt_conf_bge_heading_title": "Hintergrund Effekt/Farbe",
"edt_conf_bobls_heading_title": "Boblight Server",
"edt_conf_cec_actions_header_expl": "Definiere, welche Aktion bei einem erfolgten CEC-Ereignis durchgeführt werden soll",
"edt_conf_cec_actions_header_item_title": "Aktion",
"edt_conf_cec_actions_header_title": "Aktionen",
"edt_conf_cec_button_release_delay_ms_expl": "Auslösezeit der Fernbedienungstaste",
"edt_conf_cec_button_release_delay_ms_title": "Auslösezeit einer Taste",
"edt_conf_cec_button_repeat_rate_ms_expl": "Wiederholungsrate bei Tastendruck auf der Fernbedienung",
"edt_conf_cec_button_repeat_rate_ms_title": "Tasten Wiederholrate",
"edt_conf_cec_double_tap_timeout_ms_expl": "Verzögerung beim Drücken der Fernbedienungstaste vor der Wiederholung",
"edt_conf_cec_double_tap_timeout_ms_title": "Tastenverzögerung vor Wiederholung",
"edt_conf_cec_event_expl": "CEC Ereignis, das eine Aktion auslöst",
"edt_conf_cec_event_title": "CEC Ereigniss",
"edt_conf_color_accuracyLevel_expl": "Stufe, wie genau dominante Farben ausgewertet werden. Eine höhere Stufe erzeugt genauere Ergebnisse, erfordert aber auch mehr Rechenleistung. Sollte mit reduzierter Pixelverarbeitung kombiniert werden.",
"edt_conf_color_accuracyLevel_title": "Genauigkeitsstufe",
"edt_conf_color_backlightColored_expl": "Die Hintergrundbeleuchtung kann mit oder ohne Farbanteile genutzt werden.",
@ -332,7 +360,14 @@
"edt_conf_enum_NTSC": "NTSC",
"edt_conf_enum_PAL": "PAL",
"edt_conf_enum_SECAM": "SECAM",
"edt_conf_enum_VERTICAL": "Horizontal",
"edt_conf_enum_VERTICAL": "Vertikal",
"edt_conf_enum_action_idle": "Leerlauf",
"edt_conf_enum_action_restart": "Neustart",
"edt_conf_enum_action_resume": "Aktivieren",
"edt_conf_enum_action_resumeIdle": "Wiederaufnahme des Betriebs",
"edt_conf_enum_action_suspend": "Ruhezustand",
"edt_conf_enum_action_toggleIdle": "Leerlauf an/aus",
"edt_conf_enum_action_toggleSuspend": "Ruhezustand an/aus",
"edt_conf_enum_automatic": "Automatisch",
"edt_conf_enum_bbclassic": "Klassisch",
"edt_conf_enum_bbdefault": "Standard",
@ -341,6 +376,12 @@
"edt_conf_enum_bgr": "BGR",
"edt_conf_enum_bottom_up": "von unten nach oben",
"edt_conf_enum_brg": "BRG",
"edt_conf_enum_cec_key_f1_blue": "Blaue Taste gedrückt",
"edt_conf_enum_cec_key_f2_red": "Rote Taste gedrückt",
"edt_conf_enum_cec_key_f3_green": "Grüne Taste gedrückt",
"edt_conf_enum_cec_key_f4_yellow": "Gelbe Taste gedrückt",
"edt_conf_enum_cec_opcode_set stream path": "TV eingeschaltet",
"edt_conf_enum_cec_opcode_standby": "TV ausgeschaltet",
"edt_conf_enum_color": "Farbe",
"edt_conf_enum_custom": "Benutzerdefiniert",
"edt_conf_enum_decay": "Dämpfung",
@ -386,7 +427,7 @@
"edt_conf_fbs_timeout_title": "Zeitüberschreitung",
"edt_conf_fg_display_expl": "Gebe an, von welchem Desktop aufgenommen werden soll. (Multi Monitor Setup)",
"edt_conf_fg_display_title": "Display",
"edt_conf_fg_frequency_Hz_expl": "Wie schnell werden neue Bilder aufgenommen.",
"edt_conf_fg_frequency_Hz_expl": "Wie schnell neue Bilder aufgenommen werden, d. h. die Abtastrate. Hinweis: Das Video kann mit einer höheren oder niedrigeren Bildrate wiedergegeben werden.",
"edt_conf_fg_frequency_Hz_title": "Aufnahmefrequenz",
"edt_conf_fg_heading_title": "Bildschirm Aufnahme",
"edt_conf_fg_height_expl": "Verkleinere Bild auf dieser Höhe, da das Rohmaterial viel Leistung benötigen würde.",
@ -455,22 +496,28 @@
"edt_conf_log_level_expl": "Abhängig der Stufe sind weniger oder mehr Meldungen sichtbar.",
"edt_conf_log_level_title": "Protokollstufe",
"edt_conf_net_apiAuth_expl": "Zwinge alle Anwendungen, welche die Hyperion API nutzen sich zu authentifizieren. Aktivieren für höhere Sicherheit, da nun jede neue Anwendung einmalig von dir bestätigt werden muss.",
"edt_conf_net_apiAuth_title": "API-Authentifizierung",
"edt_conf_net_heading_title": "Network",
"edt_conf_net_internetAccessAPI_expl": "Erlaube Zugriff auf das Hyperion API/Webinterface über das Internet. Deaktiviere den Zugriff für höhere Sicherheit.",
"edt_conf_net_internetAccessAPI_title": "Internet API-Zugriff",
"edt_conf_net_ipWhitelist_expl": "Anstatt den Zugriff für alle Verbindungen aus dem Internet zu erlauben kannst du hier Ausnahmen für zugelassene IP-Adressen hinzufügen.",
"edt_conf_net_ipWhitelist_title": "Erlaubte IP-Adressen",
"edt_conf_net_ip_itemtitle": "IP",
"edt_conf_net_localAdminAuth_expl": "Wenn aktiviert, muss der Administrationszugriff aus dem Heimnetzwerk mit einem Passwort authentifiziert werden.",
"edt_conf_net_localAdminAuth_title": "Lokale Admin Authentifizierung",
"edt_conf_net_localApiAuth_expl": "Wenn aktiviert, müssen Verbindungen aus dem Heimnetzwerk mit einem Token authentifiziert werden.",
"edt_conf_net_localApiAuth_title": "Lokale API-Authentifizierung",
"edt_conf_net_restirctedInternetAccessAPI_expl": "Den Zugriff auf die API über das Internet auf bestimmte IP-Adressen beschränken",
"edt_conf_net_restirctedInternetAccessAPI_title": "Auf IP-Adressen beschränken",
"edt_conf_os_events_lockEnable_expl": "Reagiere auf Ereignisse beim Sperren/Entsperren des Bildschirms",
"edt_conf_os_events_lockEnable_title": "Reagiere auf Bildschirmsperre",
"edt_conf_os_events_suspendEnable_expl": "Reagiere auf Ereignisse, die das Betriebssystem aussetzen/fortsetzen",
"edt_conf_os_events_suspendEnable_title": "Reagiere auf Ruhezusstand",
"edt_conf_os_events_suspendOnLockEnable_expl": "Wechsel in den Ruhezustand, wenn der Bildschirm gesperrt ist, andernfalls in den Leerlaufmodus wechseln",
"edt_conf_os_events_suspendOnLockEnable_title": "Leerlauf, bei Bildschirmsperre",
"edt_conf_pbs_heading_title": "Protocol Buffers Server",
"edt_conf_pbs_timeout_expl": "Wenn für die angegebene Zeit keine Daten empfangen werden, wird die Komponente (vorübergehend) deaktiviert",
"edt_conf_pbs_timeout_title": "Zeitüberschreitung",
"edt_conf_sched_actions_header_expl": "Lege fest, welche Aktion zu einem bestimmten Zeitpunkt stattfinden soll. Die Aktion wird täglich ausgeführt.",
"edt_conf_sched_actions_header_item_title": "Aktion",
"edt_conf_sched_actions_header_title": "Aktionen",
"edt_conf_smooth_continuousOutput_expl": "Aktualisiere die LEDs, auch wenn das Bild sich nicht geändert hat.",
"edt_conf_smooth_continuousOutput_title": "Fortlaufende Ausgabe",
"edt_conf_smooth_decay_expl": "Dämpfungsgrad. Linare Dämpfung = 1; Werte größer eins haben einen stärkeren effekt.",
@ -488,6 +535,8 @@
"edt_conf_smooth_updateDelay_title": "Aktualisierungsverzögerung",
"edt_conf_smooth_updateFrequency_expl": "Die Geschwindigkeit der Datenausgabe an die LED-Steuerung.",
"edt_conf_smooth_updateFrequency_title": "Aktualisierungsfrequenz",
"edt_conf_time_event_expl": "Zeitpunkt, zu dem eine Aktion ausgelöst wird",
"edt_conf_time_event_title": "Zeitpunkt",
"edt_conf_v4l2_blueSignalThreshold_expl": "Je höher der Blauwert ist, je eher wird bei entsprechendem Blauanteil abgeschaltet.",
"edt_conf_v4l2_blueSignalThreshold_title": "Schwelle Blauwert",
"edt_conf_v4l2_cecDetection_expl": "Die USB-Erfassung wird vorübergehend deaktiviert, wenn ein CEC-Standby-Signal vom HDMI-Bus empfangen wird.",
@ -508,7 +557,7 @@
"edt_conf_v4l2_encoding_title": "Videokodierungsformat",
"edt_conf_v4l2_flip_expl": "Hiermit kannst du das Bild in horizontaler, vertikaler oder in beide Richtungen spiegeln.",
"edt_conf_v4l2_flip_title": "Spiegelung",
"edt_conf_v4l2_fpsSoftwareDecimation_expl": "Jeder n-te Frame wird übersprungen um Ressourcen zu sparen.\nBeispiel: Ein Wert von 5 resultiert bei einem Aufnahmegerät mit 30fps in einer neuen Framerate von 6 fps.",
"edt_conf_v4l2_fpsSoftwareDecimation_expl": "Um Ressourcen zu sparen, wird nur jedes n-te Bild verarbeitet. Wenn z.B. der Grabber auf 30fps eingestellt ist und diese Option auf 5 gesetzt ist, wird das Endergebnis ca. 6fps sein.",
"edt_conf_v4l2_fpsSoftwareDecimation_title": "Überspringen von Frames",
"edt_conf_v4l2_framerate_expl": "Die unterstützten Bilder pro Sekunde des aktiven Gerätes. Auf 'Automatisch' wird der gewählte Modus vom v4l interface beibehalten.",
"edt_conf_v4l2_framerate_title": "Bilder pro Sekunde",
@ -556,10 +605,12 @@
"edt_conf_webc_keyPassPhrase_title": "Schlüsselpasswort",
"edt_conf_webc_keyPath_expl": "Pfad zum privaten Schlüssel (Format in PEM, verschlüsselt mit RSA)",
"edt_conf_webc_keyPath_title": "Schlüssel-Pfad",
"edt_conf_webc_port_expl": "Port für WebServer, RPC und WebSocket (HTTP-Verbindungen)",
"edt_conf_webc_port_title": "HTTP Port",
"edt_conf_webc_sslport_expl": "Port des HTTPS-Webservers",
"edt_conf_webc_sslport_title": "HTTPS Port",
"edt_dev_auth_key_title": "Authentisierungstoken",
"edt_dev_auth_key_title_info": "Authentifizierungstoken für das Gerät",
"edt_dev_auth_key_title": "Autorisierungs-Token",
"edt_dev_auth_key_title_info": "Autorisierungs-Token für den Zugriff auf das Gerät erforderlich",
"edt_dev_enum_sub_min_cool_adjust": "Minimale Anpassung: cool",
"edt_dev_enum_sub_min_warm_adjust": "Minimale Anpassung: warm",
"edt_dev_enum_subtract_minimum": "Subtrahiere Minimum",
@ -612,7 +663,7 @@
"edt_dev_spec_gpioBcm_title": "GPIO Pin",
"edt_dev_spec_gpioMap_title": "GPIO Zuweisung",
"edt_dev_spec_gpioNumber_title": "GPIO Nummer",
"edt_dev_spec_groupId_title": "Gruppen ID",
"edt_dev_spec_groupId_title": "Gruppe",
"edt_dev_spec_header_title": "Spezifische Einstellungen",
"edt_dev_spec_interpolation_title": "Interpolation",
"edt_dev_spec_intervall_title": "Intervall",
@ -677,6 +728,7 @@
"edt_dev_spec_transistionTime_title": "Übergangszeit",
"edt_dev_spec_uid_title": "UID",
"edt_dev_spec_universe_title": "Universum",
"edt_dev_spec_useAPIv2_title": "Benutze API v2",
"edt_dev_spec_useEntertainmentAPI_title": "Hue Entertainment API verwenden",
"edt_dev_spec_useOrbSmoothing_title": "Nutze Orb Glättung",
"edt_dev_spec_useRgbwProtocol_title": "Nutze RGBW Protokoll",
@ -703,7 +755,7 @@
"edt_eff_colorHour": "Farbe Stunde",
"edt_eff_colorMarker": "Marker Farbe",
"edt_eff_colorMinute": "Farbe Minute",
"edt_eff_colorSecond": "Farbe Sekunde",
"edt_eff_colorSecond": "Farbe der Sekunden",
"edt_eff_colorcount": "Farblänge",
"edt_eff_colorend": "Farbe Ende",
"edt_eff_colorendtime": "Zeit für Start-Farbe",
@ -748,6 +800,8 @@
"edt_eff_ledlist": "LED-Liste",
"edt_eff_ledtest_header": "LED-Test",
"edt_eff_ledtest_header_desc": "Rotierende Ausgabe von Rot, Grün, Blau, Weiß und Schwarz",
"edt_eff_ledtest_seq_header": "LED-Test - Sequenz",
"edt_eff_ledtest_seq_header_desc": "Die LEDs nacheinander aufleuchten lassen",
"edt_eff_length": "Länge",
"edt_eff_lightclock_header": "Lichtuhr",
"edt_eff_lightclock_header_desc": "Eine echte Uhr als Licht! Passe die Farben von Stunden, Minuten, Sekunden deinen Vorstellungen an. Optional können 3/6/9/12 Uhr Markierungen aktiviert werden. Sollte die Uhr eine falsche Zeit anzeigen, überprüfe die Uhrzeit deines Systems.",
@ -916,7 +970,9 @@
"general_speech_en": "Englisch",
"general_speech_es": "Spanisch",
"general_speech_fr": "Französisch",
"general_speech_he": "Hebräisch",
"general_speech_hu": "Ungarisch",
"general_speech_id": "Indonesisch",
"general_speech_it": "Italienisch",
"general_speech_ja": "Japanisch",
"general_speech_nb": "Norwegisch (Bokmål)",
@ -927,6 +983,7 @@
"general_speech_ru": "Russisch",
"general_speech_sv": "Schwedisch",
"general_speech_tr": "Türkisch",
"general_speech_uk": "Ukrainisch",
"general_speech_vi": "Vietnamesisch",
"general_speech_zh-CN": "Chinesisch (vereinfacht)",
"general_webui_title": "Hyperion - Web Konfiguration",
@ -974,6 +1031,8 @@
"main_menu_dashboard_token": "Dashboard",
"main_menu_effect_conf_token": "Effekte",
"main_menu_effectsconfigurator_token": "Effekt Konfigurator",
"main_menu_event_services_token": "Ereignisse & Aktionen",
"main_menu_events": "Ereignisse & Aktionen",
"main_menu_general_conf_token": "Allgemein",
"main_menu_grabber_conf_token": "Aufnahme Hardware",
"main_menu_input_selection_token": "Eingabeauswahl",
@ -1008,8 +1067,8 @@
"remote_input_setsource_btn": "Wähle Quelle",
"remote_input_sourceactiv_btn": "Quelle aktiv",
"remote_input_status": "Status/Aktion",
"remote_losthint": "Notiz: Alle Änderungen gehen nach einem Neustart verloren.",
"remote_maptype_intro": "Für gewöhnlich entscheidet dein LED-Layout welcher Bildbereich welche LED zugewiesen bekommt, dies kann hier geändert werden. $1",
"remote_losthint": "Hinweis: Alle Änderungen gehen nach einem Neustart verloren.",
"remote_maptype_intro": "Für gewöhnlich entscheidet dein LED-Layout welcher Bildbereich welche LED zugewiesen bekommt, dies kann hier geändert werden: $1",
"remote_maptype_label": "LED-Bereich Zuordnung",
"remote_maptype_label_dominant_color": "Dominante Farbe",
"remote_maptype_label_dominant_color_advanced": "Dominante Farbe fortgeschritten",
@ -1034,7 +1093,6 @@
"support_label_fbtext": "Teile Inhalte in Facebook und halte dich und andere auf dem Laufenden",
"support_label_forumtext": "Diskussion und Hilfestellung von der Community",
"support_label_forumtitle": "Forum",
"support_label_ggtext": "Platziere uns in deinen Kreisen auf Google+",
"support_label_ghtext": "Besuche uns auf GitHub",
"support_label_igtext": "Schau doch mal bei Instagram vorbei!",
"support_label_intro": "Hyperion ist ein kostenloses Open Source Projekt und ein kleines Team arbeitet an seiner Weiterentwicklung. Darum benötigen wir DEINE Unterstützung, um weiter in bessere Infrastruktur und Weiterentwicklung investieren zu können.",
@ -1086,7 +1144,7 @@
"wiz_cololight_noprops": "Auf die Geräteeigenschaften kann nicht zugegriffen werden - Konfiguriere die Anzahl der LEDs manuell.",
"wiz_cololight_title": "Cololight Einrichtungsassistent",
"wiz_guideyou": "Der $1 wird dich durch die Konfiguration leiten, drücke dazu einfach den Button!",
"wiz_hue_blinkblue": "Lasse ID $1 blau aufleuchten",
"wiz_hue_blinkblue": "Lass es aufleuchten",
"wiz_hue_clientkey": "Clientkey:",
"wiz_hue_create_user": "Neuen Benutzer erstellen",
"wiz_hue_desc1": "1. Es wird automatisch nach der Hue Bridge gesucht, sollte sie nicht gefunden werden, gebe die IP-Adresse an und drücke den \"neu laden\" Button.<br> 2. Erfasse eine gültige Benutzer-ID. Diese kann hier auch erstellt werden.",
@ -1119,6 +1177,13 @@
"wiz_identify_tip": "Lasse das konfigurierte Gerät kurz aufleuchten",
"wiz_ids_disabled": "Deaktiviert",
"wiz_ids_entire": "Ganzes Bild",
"wiz_layout": "Layout generieren",
"wiz_layout_tip": "Generiere ein Layout für das konfigurierte Gerät",
"wiz_nanoleaf_failure_auth_token": "Bitte drück die Nanoleaf Power On/Off Taste innerhalb von 30 Sekunden",
"wiz_nanoleaf_failure_auth_token_t": "Zeitüberschreitung bei der Generierung von Autorisierungs-Token",
"wiz_nanoleaf_press_onoff_button": "Bitte drück die Ein-/Ausschalttaste an deinem Nanoleaf-Gerät für 5-7 Sekunden",
"wiz_nanoleaf_user_auth_intro": "Der Assistent unterstützt dich bei der Erstellung eines Autorisierungs-Tokens, das erforderlich ist, damit Hyperion auf das Gerät zugreifen kann.",
"wiz_nanoleaf_user_auth_title": "Assistent zum Erzeugen von Autorisierungs-Tokens",
"wiz_noLights": "Es wurden keine $1s gefunden! Bitte verbinde die $1s mit dem Netzwerk oder konfiguriere sie manuell.",
"wiz_pos": "Position/Status",
"wiz_rgb_expl": "Der Farbpunkt ändert alle x Sekunden die Farbe (rot, grün), zur selben Zeit ändern deine LEDs die Farbe ebenfalls. Beantworte die Fragen unten, um deine RGB Byte Reihenfolge zu überprüfen/korrigieren.",

View File

@ -4,17 +4,23 @@
"InfoDialog_changePassword_success": "Ο κωδικός πρόσβασης αποθηκεύτηκε με επιτυχία!",
"InfoDialog_changePassword_title": "Αλλαγή κωδικού",
"InfoDialog_iswitch_text": "Εάν εκτελείτε το Hyperion περισσότερες από μία φορές στο τοπικό σας δίκτυο, μπορείτε να κάνετε εναλλαγή μεταξύ των διαμορφώσεων ιστού. Επιλέξτε την παρουσία Hyperion παρακάτω και αλλάξτε!",
"InfoDialog_iswitch_title": "Επιλογέας Hyperion",
"InfoDialog_nostorage_text": "Το πρόγραμμα περιήγησής σας δεν υποστηρίζει τοπική αποθήκευση. Δεν μπορείτε να αποθηκεύσετε μια συγκεκριμένη ρύθμιση γλώσσας (επιστροφή στην «αυτόματη ανίχνευση») και επίπεδο πρόσβασης (επιστροφή στην «προεπιλογή»). Μερικοί μάγοι μπορεί να είναι κρυφοί. Θα μπορούσατε ακόμα να χρησιμοποιήσετε τη διεπαφή ιστού χωρίς περαιτέρω προβλήματα",
"InfoDialog_nowrite_foottext": "Το WebUI θα ξεκλειδωθεί αυτόματα μόλις λύσετε το πρόβλημα!",
"InfoDialog_nowrite_text": "Το Hyperion δεν μπορεί να γράψει στο τρέχον φορτωμένο αρχείο διαμόρφωσης. Επιδιορθώστε τα δικαιώματα του αρχείου για να συνεχίσετε.",
"InfoDialog_nowrite_title": "Σφάλμα άδειας εγγραφής!",
"about_3rd_party_licenses": "Άδεια τρίτου μέρους",
"about_build": "Κατασκευή",
"about_builddate": "Ημερομηνία κατασκευής",
"about_contribute": "Αναπτύξτε το Hyperion περαιτέρω με εμάς!",
"about_credits": "Πιστώσεις σε όλους αυτούς τους προγραμματιστές!",
"about_resources": "$1 βιβλιοθήκες",
"about_translations": "Μεταφράσεις",
"about_version": "Έκδοση",
"conf_colors_blackborder_intro": "Παραλείψτε τις μαύρες μπάρες όπου κι αν βρίσκονται. Κάθε λειτουργία χρησιμοποιεί έναν άλλο αλγόριθμο ανίχνευσης που είναι συντονισμένος για ειδικές καταστάσεις. Αυξήστε το όριο αν δεν λειτουργεί για εσάς.",
"conf_colors_color_intro": "Δημιουργήστε ένα ή περισσότερα προφίλ βαθμονόμησης, προσαρμόστε κάθε χρώμα, φωτεινότητα, γραμμικοποίηση και άλλα.",
"conf_colors_smoothing_intro": "Η εξομάλυνση ομαλοποιεί τις αλλαγές σε χρώμα/φωτεινότητα και μειώνει τις ενοχλητικές αποσπάσεις.",
"conf_effect_bgeff_intro": "Καθορίστε ένα εφέ/χρώμα παρασκηνίου, για να εμφανίζεται όταν το Hyperion είναι σε \"αδρανοποιημένο\". Εκκινείται πάντα με προτεραιότητα στο κανάλι 255.",
"conf_effect_fgeff_intro": "Καθορίστε ένα εφέ εκκίνησης ή ένα χρώμα, το οποίο εμφανίζεται κατά την εκκίνηση του Hyperion για την καθορισμένη διάρκεια.",
"conf_effect_path_intro": "Φόρτωση εφέ από τις καθορισμένες διαδρομές. Επιπλέον, μπορείτε να απενεργοποιήσετε μεμονωμένα εφέ ονομαστικά για να τα αποκρύψετε από όλες τις λίστες εφέ.",
"conf_general_impexp_expbtn": "Εξαγωγή",
@ -47,6 +53,8 @@
"conf_leds_layout_cl_bottom": "Κάτω",
"conf_leds_layout_cl_bottomleft": "Κάτω αριστερά (Γωνία)",
"conf_leds_layout_cl_bottomright": "Κάτω Δεξιά (Γωνία)",
"conf_leds_layout_cl_cornergap": "Διάκενο γωνιών",
"conf_leds_layout_cl_edgegap": "Διάκενο περιθωρίου",
"conf_leds_layout_cl_gaglength": "Μήκος κενού",
"conf_leds_layout_cl_gappos": "θέση κενού",
"conf_leds_layout_cl_hleddepth": "Οριζόντιο βάθος LED",
@ -95,11 +103,13 @@
"conf_leds_layout_matrix": "Διάταξη Μήτρας (Τοίχος LED)",
"conf_leds_layout_pbl": "Δείξτε κάτω Αριστερά",
"conf_leds_layout_pbr": "Δείξτε κάτω Δεξιά",
"conf_leds_layout_peview": "Προεπισκόπηση διάταξης LED",
"conf_leds_layout_preview_l1": "Αυτό είναι το πρώτο σας LED (θέση εισόδου)",
"conf_leds_layout_preview_l2": "Αυτό οπτικοποιεί την κατεύθυνση των δεδομένων (δεύτερο/τρίτο LED)",
"conf_leds_layout_preview_ledpower": "Μέγιστη κατανάλωση ενέργειας: $1 Α",
"conf_leds_layout_preview_originCL": "Δημιουργήθηκε από: Κλασική διάταξη (πλαίσιο LED)",
"conf_leds_layout_preview_originMA": "Δημιουργήθηκε από: Διάταξη Μήτρας (τείχος LED)",
"conf_leds_layout_preview_originTEXT": "Δημιουργήθηκε από: Πλαίσιο κειμένου",
"conf_leds_layout_preview_totalleds": "Πλήθος LED: $1",
"conf_leds_layout_ptl": "Δείξτε πάνω Αριστερά",
"conf_leds_layout_ptlh": "Οριζόντια",
@ -115,13 +125,22 @@
"conf_leds_optgroup_network": "Δίκτυο",
"conf_leds_optgroup_other": "Άλλο",
"conf_leds_optgroup_usb": "USB/Serial",
"conf_logging_btn_autoscroll": "Αυτόματη κύλιση",
"conf_logging_btn_pbupload": "Μεταφόρτωση αναφοράς για αιτήματα υποστήριξης",
"conf_logging_contpolicy": "Αναφορά Πολιτικής Απορρήτου",
"conf_logging_label_intro": "Περιοχή ελέγχου αρχείων καταγραφών συστήματος, θα βλέπετε περισσότερα ή λιγότερα ανάλογα την ρύθμιση του επίπεδου των καταγραφών.",
"conf_logging_lastreports": "Προηγούμενες αναφορές",
"conf_logging_nomessage": "Μη διαθέσιμα αρχεία καταγραφής συστήματος.",
"conf_logging_report": "Αναφορά",
"conf_logging_uplfailed": "Η μεταφόρτωση απέτυχε! Ελέγξτε τη σύνδεσή σας στο Διαδίκτυο!",
"conf_logging_uploading": "Προετοιμασία δεδομένων...",
"conf_logging_uplpolicy": "Κάνοντας κλικ σε αυτό το κουμπί αποδέχεστε το",
"conf_logging_yourlink": "Σύνδεσμος στην αναφορά σας",
"conf_network_bobl_intro": "Δέκτης για το Boblight",
"conf_network_fbs_intro": "Δέκτης για Flatbuffers της Google. Χρησιμοποιείται για γρήγορη αποστολή της εικόνας.",
"conf_network_forw_intro": "Προωθήστε όλες τις εισόδους σε μια δεύτερη εγκατάσταση Hyperion που θα μπορούσε να οδηγηθεί με άλλο ελεγκτή LED",
"conf_network_json_intro": "Η JSON-RPC θύρα για όλες τις διεργασίες του Hyperion, χρησιμοποιείται για απομακρυσμένο χειρισμό.",
"conf_network_proto_intro": "Η θύρα PROTO για όλες τις διεργασίες Hyperion, χρησιμοποιείται για μεταδώσεις εικόνας (HyperionScreenCap, πρόσθετο Kodi, Android Hyperion Grabber, ...)",
"conf_network_tok_cidhead": "Περιγραφή",
"conf_network_tok_desc": "Τα διακριτικά παρέχουν σε άλλες εφαρμογές πρόσβαση στο Hyperion API, μια εφαρμογή μπορεί να ζητήσει ένα διακριτικό όπου πρέπει να το αποδεχτείτε ή να τις δημιουργήσετε μόνοι σας παρακάτω. Αυτά τα διακριτικά απαιτούνται απλώς όταν η \"Εξουσιοδότηση API\" είναι ενεργοποιημένη στις ρυθμίσεις δικτύου.",
"conf_network_tok_grantMsg": "Μια εφαρμογή ζήτησε ένα διακριτικό για να αποκτήσει πρόσβαση στο Hyperion API. Θέλετε να παραχωρήσετε πρόσβαση; Επαληθεύστε τις παρεχόμενες πληροφορίες!",
@ -129,8 +148,11 @@
"conf_network_tok_title": "Διαχείρηση Διακριτικών",
"conf_webconfig_label_intro": "Ρυθμίσεις Webconfiguration. Επεξεργαστείτε με σύνεση.",
"dashboard_alert_message_confedit": "Η διαμόρφωση του Hyperion έχει τροποποιηθεί. Για να το εφαρμόσετε, επανεκκινήστε το Hyperion.",
"dashboard_alert_message_confedit_t": "Τροποποιημένη διαμόρφωση",
"dashboard_alert_message_confsave_success": "Η διαμόρφωσή σας στο Hyperion αποθηκεύτηκε επιτυχώς. Οι αλλαγές σας είναι πλέον ενεργές.",
"dashboard_alert_message_confsave_success_t": "Η διαμόρφωση αποθηκεύτηκε",
"dashboard_alert_message_disabled": "Η διαδικασία είναι απενεργοποιημένη! Για να την χρησιμοποιήσετε ξανά, ενεργοποιήστε την από τον πίνακα ελέγχου.",
"dashboard_alert_message_disabled_t": "Απενεργοποιημένη η διαδικασία για το υλισμικό LED",
"dashboard_componentbox_label_comp": "Στοιχείο",
"dashboard_componentbox_label_status": "Κατάσταση",
"dashboard_componentbox_label_title": "Κατάσταση στοιχείου",
@ -164,14 +186,17 @@
"edt_append_s": "s",
"edt_append_sdegree": "s/μοίρα",
"edt_conf_bb_blurRemoveCnt_title": "Θόλωσε πίξελ",
"edt_conf_bb_heading_title": "Ανίχνευση μαύρων μπαρών",
"edt_conf_bb_mode_title": "Τρόπο",
"edt_conf_bb_threshold_title": "Κατώφλι",
"edt_conf_color_black_expl": "Η βαθμονομημένη τιμή μαύρου.",
"edt_conf_color_black_title": "Μαύρο",
"edt_conf_color_blue_expl": "Η βαθμονομημένη τιμή μπλε.",
"edt_conf_color_blue_title": "Μπλε",
"edt_conf_color_brightness_title": "Φωτεινότητα",
"edt_conf_color_channelAdjustment_header_expl": "Δημιουργήστε προφίλ χρωμάτων που θα μπορούσαν να αντιστοιχιστούν σε ένα συγκεκριμένο στοιχείο. Προσαρμόστε χρώμα, γάμμα, φωτεινότητα, αντιστάθμιση και πολλά άλλα.",
"edt_conf_color_channelAdjustment_header_itemtitle": "Προφίλ",
"edt_conf_color_channelAdjustment_header_title": "Διόρθωση κανάλι χρώματος",
"edt_conf_color_cyan_expl": "Η βαθμονομημένη τιμή κυανού.",
"edt_conf_color_cyan_title": "Κυανό",
"edt_conf_color_green_expl": "Η βαθμονομημένη τιμή πράσινου.",
@ -179,6 +204,7 @@
"edt_conf_color_heading_title": "Βαθμονόμηση Χρώματος",
"edt_conf_color_id_title": "ID",
"edt_conf_color_imageToLedMappingType_expl": "Αντικαθιστά την εκχώρηση περιοχής LED της διάταξης LED εάν δεν είναι \"πολύχρωμη\"",
"edt_conf_color_imageToLedMappingType_title": "Ανάθεση επιφάνειας LED",
"edt_conf_color_leds_expl": "Αντιστοιχίστε αυτήν τη ρύθμιση σε όλα τα LED (*) ή μόνο σε μερικά (0-24).",
"edt_conf_color_leds_title": "Δείκτης LED",
"edt_conf_color_magenta_expl": "Η βαθμονομημένη τιμή ματζέντας.",
@ -199,6 +225,7 @@
"edt_conf_enum_VERTICAL": "Κάθετα",
"edt_conf_enum_automatic": "Αυτόματο",
"edt_conf_enum_bbclassic": "Κλασσικό",
"edt_conf_enum_bbdefault": "Προεπιλεγμένο",
"edt_conf_enum_bbletterbox": "Γραμματοκιβώτιο",
"edt_conf_enum_bbosd": "OSD",
"edt_conf_enum_bgr": "BGR",
@ -214,7 +241,9 @@
"edt_conf_enum_grb": "GRB",
"edt_conf_enum_hsv": "HSV",
"edt_conf_enum_linear": "Γραμμικό",
"edt_conf_enum_logdebug": "Αποσφαλμάτωση",
"edt_conf_enum_logsilent": "Αθόρυβο",
"edt_conf_enum_logverbose": "Αναλυτικά",
"edt_conf_enum_logwarn": "Προειδοποίση",
"edt_conf_enum_multicolor_mean": "Πολύχρωμο",
"edt_conf_enum_please_select": "Παρακαλώ Επιλέξτε",
@ -226,6 +255,7 @@
"edt_conf_enum_udp_raw": "RAW",
"edt_conf_enum_unicolor_mean": "Μονοχρωματικό",
"edt_conf_fg_display_title": "Απεικόνηση",
"edt_conf_fg_frequency_Hz_title": "Συχνότητα καταγραφής",
"edt_conf_fg_heading_title": "Καταγραφή Οθόνης",
"edt_conf_fg_height_expl": "Συρρικνώστε την εικόνα σε αυτό το ύψος, καθώς η ακατέργαστη εικόνα χρειάζεται πολύ χρόνο cpu.",
"edt_conf_fg_height_title": "Ύψος",
@ -248,8 +278,15 @@
"edt_conf_gen_name_title": "Όνομα διαμόρφωσης",
"edt_conf_gen_showOptHelp_expl": "Εμφάνιση όλων των διαθέσιμων επεξηγήσεων σε κάθε ενότητα. Συνιστάται ανεπιφύλακτα για αρχάριους!",
"edt_conf_gen_showOptHelp_title": "Δείξε παραδείγματα",
"edt_conf_general_enable_expl": "Αν είναι επιλεγμένο, η συνιστώσα είναι ενεργοποιημένη.",
"edt_conf_general_enable_title": "Ενεργοποίηση",
"edt_conf_general_port_expl": "Η θύρα που χρησιμοποιείται.",
"edt_conf_general_port_title": "Θύρα",
"edt_conf_general_priority_expl": "Η προτεραιότητα αυτής της συνιστώσας",
"edt_conf_general_priority_title": "Κανάλι προτεραιότητας",
"edt_conf_instC_systemEnable_title": "Ενεργοποίηση καταγραφής οθόνης",
"edt_conf_instC_v4lEnable_title": "Ενεργοποίηση συσκευής καταγραφής μέσω USB",
"edt_conf_instCapture_heading_title": "Συσκευές καταγραφής",
"edt_conf_net_apiAuth_expl": "Επιβολή όλων των εφαρμογών που χρησιμοποιούν το Hyperion API για έλεγχο ταυτότητας έναντι του Hyperion (Εξαίρεση: βλ. \"Τοπικός έλεγχος ταυτότητας API\"). Υψηλότερη ασφάλεια, καθώς ελέγχετε την πρόσβαση και την ανακαλείτε ανά πάσα στιγμή.",
"edt_conf_net_apiAuth_title": "Αυθεντικοποίηση ΑΡΙ",
"edt_conf_net_heading_title": "Δίκτυο",
@ -260,8 +297,6 @@
"edt_conf_smooth_heading_title": "Λείανση",
"edt_conf_smooth_interpolationRate_expl": "Ταχύτητα υπολογισμού λείων ενδιάμεσων πλαισίων.",
"edt_conf_smooth_interpolationRate_title": "Ρυθμός Παρεμβολής",
"edt_conf_smooth_outputRate_expl": "Η ταχύτητα εξόδου του χειριστή LED σας.",
"edt_conf_smooth_outputRate_title": "Ρυθμός Εξόδου",
"edt_conf_smooth_time_ms_title": "Χρόνος",
"edt_conf_smooth_type_expl": "Είδος λείανσης.",
"edt_conf_smooth_type_title": "Είδος",
@ -278,7 +313,9 @@
"edt_conf_v4l2_flip_expl": "Αυτό σας επιτρέπει να αναστρέψετε την εικόνα οριζόντια, κάθετα ή και τα δύο.",
"edt_conf_v4l2_flip_title": "Αναστροφή εικόνας",
"edt_conf_v4l2_framerate_title": "Καρέ ανά δευτερόλεπτο",
"edt_conf_v4l2_heading_title": "Λήψη εισόδου USB",
"edt_conf_v4l2_resolution_title": "Ανάλυση Συσκευής",
"edt_conf_v4l2_signalDetection_title": "Ανίχνευση σήματος",
"edt_conf_webc_keyPassPhrase_expl": "Προαιρετικό: Το κλειδί μπορεί να προστατεύεται με κωδικό πρόσβασης",
"edt_conf_webc_keyPassPhrase_title": "Κωδικός πρόσβασης",
"edt_conf_webc_sslport_title": "Θύρα HTTPS",
@ -287,21 +324,30 @@
"edt_dev_enum_subtract_minimum": "Αφαίρεση ελάχιστου",
"edt_dev_enum_white_off": "Απενεργοποίηση Λευκού",
"edt_dev_general_autostart_title": "Αυτόματη Εκκίνηση",
"edt_dev_general_colorOrder_title": "Διάταξη RGB byte",
"edt_dev_general_enableAttemptsInterval_title": "Διάστημα Επανάληψης",
"edt_dev_general_enableAttempts_title": "Προσπάθεια Σύνδεσης",
"edt_dev_general_enableAttempts_title_info": "Αριθμός προσπαθειών σύνδεσης μιας συσκευής προτού μεταβεί σε κατάσταση σφάλματος.",
"edt_dev_general_heading_title": "Γενικές Ρυθμίσεις",
"edt_dev_general_name_title": "Όνομα διαμόρφωσης",
"edt_dev_general_rewriteTime_title": "Χρόνος Ανανέωσης",
"edt_dev_spec_baudrate_title": "Ρυθμός επικοινωνίας",
"edt_dev_spec_brightnessFactor_title": "Συντελεστής φωτεινότητας",
"edt_dev_spec_brightnessMax_title": "Μέγιστη Φωτεινότητα",
"edt_dev_spec_brightnessMin_title": "Ελάχιστη Φωτεινότητα",
"edt_dev_spec_brightness_title": "Φωτεινότητα",
"edt_dev_spec_cid_title": "CID",
"edt_dev_spec_colorComponent_title": "Συνιστώσες χρώματος",
"edt_dev_spec_delayAfterConnect_title": "Καθυστέρηση μετά την σύνδεση",
"edt_dev_spec_dithering_title": "Χρωματική αντιπαράθεση",
"edt_dev_spec_dmaNumber_title": "Κανάλι DMA",
"edt_dev_spec_gamma_title": "Gamma",
"edt_dev_spec_globalBrightnessControlMaxLevel_title": "Μέγιστο επίπεδο Έντασης",
"edt_dev_spec_gpioMap_title": "Χαρτογράφηση GPIO",
"edt_dev_spec_gpioNumber_title": "Αριθμός GPIO",
"edt_dev_spec_header_title": "Συγκεκριμένες ρυθμίσεις",
"edt_dev_spec_intervall_title": "Διάστημα",
"edt_dev_spec_invert_title": "Αναστροφή σήματος",
"edt_dev_spec_ledIndex_title": "Δείκτης LED",
"edt_dev_spec_ledType_title": "Είδος LED",
"edt_dev_spec_lightid_itemtitle": "ID",
@ -310,6 +356,7 @@
"edt_dev_spec_lights_title": "Φώτα",
"edt_dev_spec_maximumLedCount_title": "Μέγιστος αριθμός LED",
"edt_dev_spec_networkDevicePort_title": "Θύρα",
"edt_dev_spec_numberOfLeds_title": "Αριθμός LED",
"edt_dev_spec_order_left_right_title": "2.",
"edt_dev_spec_order_top_down_title": "1.",
"edt_dev_spec_pid_title": "PID",
@ -317,6 +364,7 @@
"edt_dev_spec_razer_device_title": "Συσκευή RΛΖΞR Chroma",
"edt_dev_spec_serial_title": "Σειριακός Αριθμός",
"edt_dev_spec_spipath_title": "Συσκευή SPI",
"edt_dev_spec_switchOffOnBlack_title": "Απενεργοποίηση στο μαύρο",
"edt_dev_spec_targetIpHost_title": "Hostname/Διεύθυνση ΙΡ",
"edt_dev_spec_targetIp_title": "Διεύθυνση ΙΡ",
"edt_dev_spec_transistionTime_title": "Χρόνος Μετάβασης",
@ -430,6 +478,7 @@
"effectsconfigurator_button_saveeffect": "Αποθήκευση Εφέ",
"effectsconfigurator_button_starttest": "Εκκίνηση τεστ",
"effectsconfigurator_button_stoptest": "Τερματισμός τεστ",
"effectsconfigurator_editdeleff": "Διαγραφή/Φόρτωση εφέ",
"effectsconfigurator_label_chooseeff": "Επιλέξτε Πρότυπο",
"effectsconfigurator_label_effectname": "Όνομα Εφέ",
"effectsconfigurator_label_intro": "Δημιουργήστε από τα βασικά εφέ νέα εφέ που είναι συντονισμένα σύμφωνα με τις προτιμήσεις σας. Ανάλογα με το Εφέ, υπάρχουν διαθέσιμες επιλογές όπως χρώμα, ταχύτητα, κατεύθυνση και άλλα.",
@ -462,6 +511,8 @@
"general_col_green": "Πράσινο",
"general_col_red": "Κόκκινο",
"general_comp_BLACKBORDER": "Ανίχνευση μαύρης μπάρας",
"general_comp_BOBLIGHTSERVER": "Διακομιστής Boblight",
"general_comp_FLATBUFSERVER": "Διακομιστής Flatbuffers",
"general_comp_GRABBER": "Λήψη Οθόνης",
"general_comp_LEDDEVICE": "Έξοδος LED",
"general_comp_SMOOTHING": "Εξομάλυνση",
@ -505,16 +556,19 @@
"infoDialog_general_warning_title": "Προειδοπίηση",
"infoDialog_import_comperror_text": "Λυπητερό! Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την εισαγωγή. Δοκιμάστε ξανά με άλλο πρόγραμμα περιήγησης.",
"infoDialog_import_confirm_text": "Είστε βέβαιοι ότι θα εισαγάγετε το \"$1\"; Δεν είναι δυνατή η επαναφορά αυτής της διαδικασίας!",
"infoDialog_import_confirm_title": "Συμφωνήστε στην εισαγωγή",
"infoDialog_import_hyperror_text": "Δεν είναι δυνατή η εισαγωγή του επιλεγμένου αρχείου διαμόρφωσης \"$1\". Δεν είναι συμβατό με Hyperion 2.0 και νεότερη έκδοση!",
"infoDialog_import_jsonerror_text": "Το επιλεγμένο αρχείο διαμόρφωσης \"$1\" δεν είναι αρχείο .json ή είναι κατεστραμμένο. Μήνυμα σφάλματος: ($2)",
"infoDialog_password_current_text": "Τωρινός κωδικός",
"infoDialog_password_new_text": "Νέος κωδικός",
"infoDialog_username_text": "Όνομα Χρήστη",
"infoDialog_wizrgb_text": "Η διάταξη του RGB Byte έχει ήδη ρυθμιστεί σωστά.",
"infoDialog_writeconf_error_text": "Η αποθήκευση της διαμόρφωσής σας απέτυχε.",
"infoDialog_writeimage_error_text": "Το επιλεγμένο αρχείο \"$1\" δεν είναι αρχείο εικόνας ή είναι κατεστραμμένο! Επιλέξτε άλλο αρχείο εικόνας.",
"info_404": "Η σελίδα που ζητήσατε δεν είναι διαθέσιμη!",
"info_conlost_label_autorecon": "Θα επανασυνδεθείτε ξανά αφού το Hyperion είναι διαθέσιμο.",
"info_conlost_label_autorefresh": "Αυτή η σελίδα θα ανανεωθεί αυτόματα.",
"info_conlost_label_reason": "Πιθανές αιτίες:",
"info_conlost_label_reason1": "- Κακή σύνδεση WLAN",
"info_conlost_label_reason2": "- Πραγματοποιήσατε αναβάθμιση",
"info_conlost_label_reason3": "- Το Hyperion δεν τρέχει",
@ -531,30 +585,37 @@
"main_ledsim_title": "Οπτικοποίηση LED",
"main_menu_about_token": "Σχετικά με το Hyperion",
"main_menu_colors_conf_token": "Επεξεργασία εικόνας",
"main_menu_configuration_token": "LED διαδικασία",
"main_menu_dashboard_token": "Πίνακας Ελέγχου",
"main_menu_effect_conf_token": "Εφέ",
"main_menu_effectsconfigurator_token": "Παραμετροποιητής εφέ",
"main_menu_general_conf_token": "Γενικά",
"main_menu_grabber_conf_token": "Υλισμικό καταγραφής",
"main_menu_input_selection_token": "Επιλογή εισόδου",
"main_menu_instcapture_conf_token": "Πηγές",
"main_menu_leds_conf_token": "Έξοδος LED",
"main_menu_logging_token": "Καταγράψτε",
"main_menu_network_conf_token": "Υπηρεσίες δικτύου",
"main_menu_remotecontrol_token": "Ασύρματος χειρισμός",
"main_menu_support_token": "Υποστήριξη",
"main_menu_system_token": "Σύστημα",
"main_menu_update_token": "Αναβάθμιση",
"main_menu_webconfig_token": "Διαμόρφωση Ιστού",
"remote_adjustment_intro": "Παραμετροποίηση χρώματος/φωτεινότητας/εξομάλυνσης κατά την εκτέλεση. $1",
"remote_adjustment_label": "Ρύθμιση χρώματος",
"remote_color_button_reset": "Επαναφορά Χρώματος/Εφέ",
"remote_color_intro": "Ορίστε ένα εφέ ή χρώμα. Επίσης παρατίθενται τα εφέ που δημιουργήσατε εσείς (εάν είναι διαθέσιμα). $1",
"remote_color_label": "Χρώματα/Εφέ",
"remote_color_label_color": "Χρώμα:",
"remote_components_intro": "Ενεργοποίηση και απενεργοποίηση στοιχείων του Hyperion κατά τη διάρκεια του χρόνου εκτέλεσης. $1",
"remote_components_label": "Έλεγχος συνιστωσών",
"remote_effects_label_effects": "Εφέ:",
"remote_effects_label_picture": "Εικόνα:",
"remote_input_clearall": "Καθαρισμός όλων των Χρωμάτων/Εφέ",
"remote_input_duration": "Διάρκεια:",
"remote_input_intro": "Το Hyperion χρησιμοποιεί ένα σύστημα προτεραιότητας για να επιλέξει μια πηγή. Ό,τι ορίζετε έχει προτεραιότητα (Εφέ/Χρώμα/Λήψη οθόνης/Λήψη USB και πηγές δικτύου). Από προεπιλογή, το Hyperion επιλέγει πηγές ανάλογα με την προτεραιότητα (ο χαμηλότερος αριθμός αντικατοπτρίζει την τρέχουσα ενεργή πηγή). Τώρα έχετε την ευκαιρία να επιλέξετε μόνοι σας πηγές. $1",
"remote_input_ip": "ΙΡ:",
"remote_input_label": "Επιλογή πηγής",
"remote_input_label_autoselect": "Αυτόματη Επιλογή",
"remote_input_origin": "Προέλευση",
"remote_input_owner": "Είδος",
@ -574,6 +635,7 @@
"remote_videoMode_2D": "2D",
"remote_videoMode_3DSBS": "3DSBS",
"remote_videoMode_3DTAB": "3DTAB",
"remote_videoMode_intro": "Εναλλαγή μεταξύ διαφορετικών επιλογών βίντεο για να απολαύσετε ταινίες 3D! Όλες οι συσκευές καταγραφής υποστηρίζονται. $1",
"remote_videoMode_label": "Λειτουργία βίντεο",
"support_label_affinstr1": "Κάντε κλικ στον κατάλληλο σύνδεσμο της χώρας σας",
"support_label_affinstr2": "Ό,τι αγοράζετε (δεν έχει σημασία τι) παίρνουμε μια μικρή χρέωση με βάση τον τζίρο σας",
@ -584,16 +646,20 @@
"support_label_fbtext": "Μοιραστείτε τη σελίδα μας στο Hyperion στο Facebook και λάβετε ειδοποίηση όταν κυκλοφορούν νέες ενημερώσεις",
"support_label_forumtext": "Προθήκες, συζητήσεις, βοήθεια και πολλά άλλα",
"support_label_forumtitle": "Φόρουμ",
"support_label_ggtext": "Κυκλώστε μας στο Google+!",
"support_label_ghtext": "Επισκευτείτε μας στο GitHub",
"support_label_igtext": "Επισκεφθείτε μας στο Instagram για να παρακολουθήσετε τις τελευταίες φωτογραφίες του Hyperion!",
"support_label_intro": "Το Hyperion είναι ένα δωρεάν, μη-κερδοσκοπικό λογισμικό. Μια μικρή ομάδα εργάζεται πάνω σε αυτό και γι' αυτό χρειαζόμαστε τη σταθερή υποστήριξή σας.",
"support_label_spreadtheword": "Διέδωσέ το",
"support_label_title": "Υποστήριξη Hyperion",
"support_label_twtext": "Μοιραστείτε και ακολουθήστε μας στο Twitter, για να είστε πάντα ενημερωμένοι με την τελευταία ανάρτηση σχετικά με την ανάπτυξη του Hyperion",
"support_label_webpagetext": "Αρχική σελίδα του Hyperion",
"support_label_webpagetitle": "Ιστοσελίδα",
"support_label_webrestitle": "Πληροφορίες και βοηθιτικό υλικό",
"support_label_wikitext": "Το Α έως Ω για σχεδόν οτιδήποτε σχετίζεται με το Hyperion",
"support_label_wikititle": "Βιβλιογραφία",
"support_label_yttext": "Βαρεθήκατε τις φωτογραφίες; Δείτε το κανάλι μας στο YouTube!",
"update_button_changelog": "Πλήρες αρχείο αλλαγών",
"update_button_install": "Εγκατάσταση",
"update_error_getting_versions": "Παρουσιάστηκε πρόβλημα με τον προσδιορισμό της πιο πρόσφατης διαθέσιμης έκδοσης.",
"update_label_description": "Περιγραφή:",
@ -606,6 +672,7 @@
"wiz_cc_btn_stop": "Σταματήστε το βίντεο",
"wiz_cc_btn_switchpic": "Αλλαγή εικόνας",
"wiz_cc_chooseid": "Ορίστε ένα όνομα για αυτό το προφίλ χρώματος.",
"wiz_cc_kodicon": "Βρέθηκε το Kodi, προχωρήστε με την υποστήριξη του Kodi.",
"wiz_cc_kodidiscon": "Το Kodi δεν βρέθηκε, προχωρήστε χωρίς υποστήριξη Kodi (ελέγξτε εάν είναι ενεργοποιημένος ο τηλεχειρισμός από άλλα συστήματα).",
"wiz_cc_kodimsg_start": "Επιτυχία δοκιμής - ώρα να προχωρήσετε!",
"wiz_cc_kodishould": "Το Kodi θα πρέπει να δείχνει την ακόλουθη εικόνα: $1",
@ -618,17 +685,25 @@
"wiz_cc_testintro": "Ώρα για ένα πραγματικό τεστ",
"wiz_cc_testintrok": "Πατήστε ένα κουμπί παρακάτω για να ξεκινήσετε ένα δοκιμαστικό βίντεο.",
"wiz_cc_testintrowok": "Δείτε τον παρακάτω σύνδεσμο για να κατεβάσετε δοκιμαστικά βίντεο:",
"wiz_cc_title": "Οδηγός ρύθμισης βαθμονόμησης χρωμάτων",
"wiz_cc_try_connect": "Σύνδεση...",
"wiz_cololight_desc2": "Τώρα επιλέξτε ποια Cololights θα προστεθούν. Για να αναγνωρίσετε μεμονωμένα φώτα, πατήστε το κουμπί στα δεξιά.",
"wiz_cololight_noprops": "Δεν είναι δυνατή η λήψη των ιδιοτήτων της συσκευής - Ορίστε τον αριθμό των LED υλικού με μη αυτόματο τρόπο",
"wiz_guideyou": "Το $1 θα σας καθοδηγήσει στις ρυθμίσεις. Απλά πατήστε το κουμπί!",
"wiz_hue_blinkblue": "Εγένετο φως",
"wiz_hue_create_user": "Δημιουργία νέου Χρήστη",
"wiz_hue_desc1": "1. Το Hyperion αναζητά αυτόματα ένα Hue-Bridge, σε περίπτωση που δεν μπορεί να βρει, πρέπει να δώσετε το όνομα κεντρικού υπολογιστή ή τη διεύθυνση IP και να πατήσετε το κουμπί επαναφόρτωσης. <br> 2. Δώστε ένα αναγνωριστικό χρήστη, εάν δεν έχετε, δημιουργήστε ένα νέο.",
"wiz_hue_desc2": "3. Τώρα επιλέξτε ποιοι λαμπτήρες πρέπει να προστεθούν. Η θέση αντιστοιχίζει τη λάμπα σε μια συγκεκριμένη θέση στην \"εικόνα\" σας. Δεν θα προστεθούν απενεργοποιημένες λάμπες. Για να αναγνωρίσετε μεμονωμένους λαμπτήρες πατήστε το κουμπί στα δεξιά.",
"wiz_hue_e_desc1": "1. Το Hyperion αναζητά αυτόματα ένα Hue-Bridge, σε περίπτωση που δεν μπορεί να βρει, πρέπει να δώσετε το όνομα κεντρικού υπολογιστή ή τη διεύθυνση IP και να πατήσετε το κουμπί επαναφόρτωσης. <br> 2. Δώστε ένα αναγνωριστικό χρήστη και το κλειδί πελάτη, εάν δεν έχετε και τα δύο, δημιουργήστε νέα.",
"wiz_hue_e_noapisupport": "Ο Wizard έχει απενεργοποιήσει την υποστήριξη API ψυχαγωγίας και θα συνεχίσει σε κλασική λειτουργία.",
"wiz_hue_e_title": "Wizard ψυχαγωγίας Philips Hue",
"wiz_hue_failure_connection": "Τέλος χρόνου: Παρακαλώ πατήστε το κουμπί (bridge) μέσα σε διάστημα 30 δευτερολέπτων",
"wiz_hue_failure_ip": "Δεν βρέθηκε καμία γέφυρα δικτύου (bridge), παρακαλείστε να παρέχετε έγκυρο όνομα διακομιστή ή διεύθυνση IP",
"wiz_hue_failure_user": "Ο χρήστης δεν βρέθηκε, δημιουργήστε έναν νέο με το κουμπί παρακάτω ή εισάγετε ένα έγκυρο όνομα χρήστη και πατήστε το σύμβολο της \"επαναφόρτωσης\".",
"wiz_hue_intro1": "Αυτός ο βοηθός ρυθμίζει το Hyperion για το γνωστό σύστημα Philips Hue. Χαρακτηριστικά όπως την αυτόματη αναγνώριση του Hue Bridge, δημιουργίες χρήστη, τοποθέτηση κάθε Hue συσκευής σε συγκεκριμένη θέση στην εικόνα σας ή απενεργοποίηση της και ρύθμιση των επιλογών του Hyperion αυτόματα! Στα γρήγορα: Το μόνο που χρειάζεται είναι μερικά κλικ και είστε έτοιμοι!",
"wiz_hue_ip": "Hostname ή ΙΡ",
"wiz_hue_press_link": "Παρακαλώ πατήστε το κουμπί σύζευξης στη Hue γέφυρα (bridge).",
"wiz_hue_searchb": "Αναζήτηση για γέφυρα (bridge)...",
"wiz_hue_title": "Philips Hue Wizard",
"wiz_hue_username": "ID Χρήστη",
"wiz_identify": "Αναγνώρισε",
@ -638,9 +713,13 @@
"wiz_noLights": "Δεν βρέθηκε το $1! Συνδέστε τα φώτα στο δίκτυο ή διαμορφώστε τα με μη αυτόματο τρόπο.",
"wiz_pos": "Θέση/Κατάσταση",
"wiz_rgb_expl": "Η χρωματική κουκκίδα αλλάζει κάθε x δευτερόλεπτα το χρώμα (κόκκινο, πράσινο), την ίδια στιγμή που τα LED σας αλλάζουν και το χρώμα. Απαντήστε στις ερωτήσεις στο κάτω μέρος για να ελέγξετε/διορθώσετε τη σειρά των byte.",
"wiz_rgb_intro1": "Αυτός ο βοηθός ρύθμισης θα σας οδηγήσει μέσα από την διαδικασία εύρεσης της σωστής σειράς χρωμάτων των Led σας. Κάντε κλικ στο κουμπί συνέχεια για να ξεκινήσετε.",
"wiz_rgb_intro2": "Πότε χρειάζεται αυτός ο βοηθός ρύθμισης; Παράδειγμα: όταν έχετε θέσει το χρώμα κόκκινο, αλλά εμφανίζει πράσινο ή μπλε. Μπορείτε επίσης να τον χρησιμοποιήσετε για την πρώτη παραμετροποίηση.",
"wiz_rgb_q": "Ποιο χρώμα δείχνουν τα LED σας, όταν η έγχρωμη κουκκίδα παραπάνω δείχνει...",
"wiz_rgb_qgend": "...πράσινο;",
"wiz_rgb_qrend": "...κόκινο;",
"wiz_rgb_switchevery": "Αλάξτε χρώμα κάθε...",
"wiz_rgb_title": "Βοηθός ρύθμισης διάταξης RGB Byte",
"wiz_wizavail": "Βοηθός ρύθμισης διαθέσιμος",
"wiz_yeelight_unsupported": "Μη-υποστηριζόμενο"
}

View File

@ -86,6 +86,8 @@
"conf_leds_layout_cl_bottomright": "Bottom Right (Corner)",
"conf_leds_layout_cl_cornergap": "Corner Gap",
"conf_leds_layout_cl_edgegap": "Edge Gap",
"conf_leds_layout_cl_entertainment": "Entertainment Area",
"conf_leds_layout_cl_entertainment_center": "Entertainment Area Center",
"conf_leds_layout_cl_gaglength": "Gap length",
"conf_leds_layout_cl_gappos": "gap position",
"conf_leds_layout_cl_hleddepth": "Horizontal LED depth",
@ -115,7 +117,13 @@
"conf_leds_layout_cl_topright": "Top Right (Corner)",
"conf_leds_layout_cl_vleddepth": "Vertical LED depth",
"conf_leds_layout_frame": "Classic Layout (LED Frame)",
"conf_leds_layout_gapleft": "Left gap",
"conf_leds_layout_gapright": "Right gap",
"conf_leds_layout_gaptop": "Top gap",
"conf_leds_layout_gapbottom": "Bottom gap",
"conf_leds_layout_generatedconf": "Generated/Current LED Configuration",
"conf_leds_layout_generation_success": "LED Layout generated sucessfully",
"conf_leds_layout_generation_error": "LED Layout was not generated",
"conf_leds_layout_intro": "You also need an LED layout, which reflects your LED positions. The classic layout is the usually used TV frame, but we also support LED matrix (LED walls) creation. The view on this layout is ALWAYS from the FRONT of your TV.",
"conf_leds_layout_ma_cabling": "Cabling",
"conf_leds_layout_ma_direction": "Direction",
@ -179,6 +187,7 @@
"conf_network_json_intro": "The JSON-RPC-Port of all Hyperion instances, used for remote control.",
"conf_network_net_intro": "Network related settings which are applied to all network services.",
"conf_network_proto_intro": "The PROTO-Port of all Hyperion instances, used for picture streams (HyperionScreenCap, Kodi Addon, Android Hyperion Grabber, ...)",
"conf_network_tok_idhead": "ID",
"conf_network_tok_cidhead": "Description",
"conf_network_tok_comment_title": "Token description",
"conf_network_tok_desc": "Tokens grant other applications access to the Hyperion API, an application can request a token where you need to accept it or you create them on your own below. These tokens are just required when \"API Authorization\" is enabled in network settings.",
@ -189,6 +198,12 @@
"conf_network_tok_intro": "Here you can create and delete tokens for API authentication. Created tokens will only be displayed once.",
"conf_network_tok_lastuse": "Last use",
"conf_network_tok_title": "Token Management",
"conf_cec_events_heading_title": "CEC Events",
"conf_cec_events_intro": "Settings related to different CEC (Consumer Electronics Control) protocol events Hyperion can handle",
"conf_os_events_heading_title": "Operating System Events",
"conf_os_events_intro": "Settings related to different Operating System events Hyperion can handle",
"conf_sched_events_heading_title": "Scheduled Events",
"conf_sched_events_intro": "Settings related to scheduled, i.e. time based events, which Hyperion will handle",
"conf_webconfig_label_intro": "Webconfiguration settings. Edit wisely.",
"dashboard_active_instance": "Selected instance",
"dashboard_alert_message_confedit": "Your Hyperion configuration has been modified. To apply it, restart Hyperion.",
@ -240,6 +255,30 @@
"edt_append_pixel": "Pixel",
"edt_append_s": "s",
"edt_append_sdegree": "s/degree",
"edt_conf_action_title": "Action",
"edt_conf_action_expl": "Action to be applied",
"edt_conf_action_record_validation_error": "The same event can trigger only one action. Clean up Actions $1",
"edt_conf_audio_device_expl": "Selected audio input device",
"edt_conf_audio_device_title": "Audio Device",
"edt_conf_audio_effects_expl": "Select an effect on how the audio signal is transformed to",
"edt_conf_audio_effects_title": "Audio Effects",
"edt_conf_audio_effect_enum_vumeter": "VU-Meter",
"edt_conf_audio_effect_hotcolor_expl": "Hot Color",
"edt_conf_audio_effect_hotcolor_title": "Hot Color",
"edt_conf_audio_effect_multiplier_expl": "Audio Signal Value multiplier",
"edt_conf_audio_effect_multiplier_title": "Multiplier",
"edt_conf_audio_effect_safecolor_expl": "Safe Color",
"edt_conf_audio_effect_safecolor_title": "Safe Color",
"edt_conf_audio_effect_safevalue_expl": "Safe Threshold",
"edt_conf_audio_effect_safevalue_title": "Safe Threshold",
"edt_conf_audio_effect_set_defaults": "Reset to default values",
"edt_conf_audio_effect_tolerance_expl": "Tolerance used when auto calculating a signal multipler from 0-100",
"edt_conf_audio_effect_tolerance_title": "Tolerance",
"edt_conf_audio_effect_warncolor_expl": "Warning Color",
"edt_conf_audio_effect_warncolor_title": "Warning Color",
"edt_conf_audio_effect_warnvalue_expl": "Warning Threshold",
"edt_conf_audio_effect_warnvalue_title": "Warning Threshold",
"edt_conf_audio_heading_title": "Audio Capture",
"edt_conf_bb_blurRemoveCnt_expl": "Number of pixels that get removed from the detected border to cut away blur.",
"edt_conf_bb_blurRemoveCnt_title": "Blur pixel",
"edt_conf_bb_borderFrameCnt_expl": "Number of frames before a consistent detected border is set.",
@ -255,6 +294,17 @@
"edt_conf_bb_unknownFrameCnt_title": "Unknown frames",
"edt_conf_bge_heading_title": "Background Effect/Color",
"edt_conf_bobls_heading_title": "Boblight Server",
"edt_conf_cec_actions_header_title": "Actions",
"edt_conf_cec_actions_header_expl": "Define which action should take place on a recognised CEC event",
"edt_conf_cec_actions_header_item_title": "Action",
"edt_conf_cec_button_release_delay_ms_title": "Button release time",
"edt_conf_cec_button_release_delay_ms_expl": "Remote button press release time",
"edt_conf_cec_button_repeat_rate_ms_title": "Button repeat rate",
"edt_conf_cec_button_repeat_rate_ms_expl": "Remote button press repeat rate",
"edt_conf_cec_double_tap_timeout_ms_title": "Button delay before repeating",
"edt_conf_cec_double_tap_timeout_ms_expl": "Remote button press delay before repeating",
"edt_conf_cec_event_title": "CEC Event",
"edt_conf_cec_event_expl": "CEC event that will trigger an action",
"edt_conf_color_accuracyLevel_expl": "Level how accurate dominat colors are evaluated. A higher level creates more accurate results, but also requries more processing power. Should to be combined with reduced pixel processing.",
"edt_conf_color_accuracyLevel_title": "Accuracy level",
"edt_conf_color_backlightColored_expl": "Add some color to your backlight.",
@ -317,6 +367,13 @@
"edt_conf_enum_HORIZONTAL": "Horizontal",
"edt_conf_enum_VERTICAL": "Vertical",
"edt_conf_enum_BOTH": "Horizontal & Vertical",
"edt_conf_enum_action_idle": "Idle",
"edt_conf_enum_action_restart": "Restart",
"edt_conf_enum_action_resume": "Resume",
"edt_conf_enum_action_resumeIdle": "ResumeIdle",
"edt_conf_enum_action_suspend": "Suspend",
"edt_conf_enum_action_toggleIdle": "ToggleIdle",
"edt_conf_enum_action_toggleSuspend": "ToggleSuspend",
"edt_conf_enum_automatic": "Automatic",
"edt_conf_enum_bbclassic": "Classic",
"edt_conf_enum_bbdefault": "Default",
@ -325,6 +382,12 @@
"edt_conf_enum_bgr": "BGR",
"edt_conf_enum_bottom_up": "Bottom up",
"edt_conf_enum_brg": "BRG",
"edt_conf_enum_cec_key_f1_blue": "Blue button pressed",
"edt_conf_enum_cec_key_f2_red": "Red button pressed",
"edt_conf_enum_cec_key_f3_green": "Green button pressed",
"edt_conf_enum_cec_key_f4_yellow": "Yellow button pressed",
"edt_conf_enum_cec_opcode_set stream path": "TV on",
"edt_conf_enum_cec_opcode_standby": "TV off",
"edt_conf_enum_color": "Color",
"edt_conf_enum_custom": "Custom",
"edt_conf_enum_decay": "Decay",
@ -393,13 +456,13 @@
"edt_conf_fw_flat_expl": "One flatbuffer target per configuration item",
"edt_conf_fw_flat_itemtitle": "flatbuffer target",
"edt_conf_fw_flat_services_discovered_expl": "Hyperion servers discovered providing flatbuffer services",
"edt_conf_fw_flat_services_discovered_title": "Flatbuffer targets discoverded",
"edt_conf_fw_flat_services_discovered_title": "Flatbuffer targets discovered",
"edt_conf_fw_flat_title": "List of flatbuffer targets",
"edt_conf_fw_heading_title": "Forwarder",
"edt_conf_fw_json_expl": "One JSON target per configuration item",
"edt_conf_fw_json_itemtitle": "JSON target",
"edt_conf_fw_json_services_discovered_expl": "Hyperion servers discovered providing JSON-API services",
"edt_conf_fw_json_services_discovered_title": "JSON targets discoverded",
"edt_conf_fw_json_services_discovered_title": "JSON targets discovered",
"edt_conf_fw_json_title": "List of JSON targets",
"edt_conf_fw_remote_service_discovered_none": "No remote services discovered",
"edt_conf_fw_service_name_expl": "Name of the service provider",
@ -439,22 +502,28 @@
"edt_conf_log_level_expl": "Depending on loglevel you see less or more messages in your log.",
"edt_conf_log_level_title": "Log-Level",
"edt_conf_net_apiAuth_expl": "Enforce all applications that use the Hyperion API to authenticate themself against Hyperion (Exception: see \"Local API Authentication\"). Higher security, as you control the access and revoke it at any time.",
"edt_conf_net_apiAuth_title": "API Authentication",
"edt_conf_net_heading_title": "Network",
"edt_conf_net_internetAccessAPI_expl": "Allow access to the Hyperion API/Webinterface from the internet. Disable for higher security.",
"edt_conf_net_internetAccessAPI_expl": "Allow access to the Hyperion API/Web Interface from the Internet. Disable for increased security.",
"edt_conf_net_internetAccessAPI_title": "Internet API Access",
"edt_conf_net_ipWhitelist_expl": "You can whitelist IP addresses instead allowing all connections from internet to connect to the Hyperion API/Webinterface.",
"edt_conf_net_ipWhitelist_title": "Whitelisted IP's",
"edt_conf_net_ipWhitelist_expl": "Define whitelisted IP addresses from which API requests from the Internet are allowed. All other external connections will be denied.",
"edt_conf_net_ipWhitelist_title": "Whitelisted IP addresses",
"edt_conf_net_ip_itemtitle": "IP",
"edt_conf_net_localAdminAuth_expl": "When enabled, administration access from your local network needs a password.",
"edt_conf_net_localAdminAuth_title": "Local Admin API Authentication",
"edt_conf_net_localApiAuth_expl": "When enabled, connections from your home network needs to authenticate themselves against Hyperion with a token.",
"edt_conf_net_localApiAuth_expl": "When disabled, API authorisation via password or token is not required for local connections. The exception is administrative commands.",
"edt_conf_net_localApiAuth_title": "Local API Authentication",
"edt_conf_net_restirctedInternetAccessAPI_expl": "You can restrict the access to the API through the internet to certain IP's.",
"edt_conf_net_restirctedInternetAccessAPI_title": "Restrict to IP's",
"edt_conf_net_restirctedInternetAccessAPI_expl": "You can restrict API requests over the Internet to only those IP addresses on the whitelist.",
"edt_conf_net_restirctedInternetAccessAPI_title": "Restrict to IP addresses",
"edt_conf_os_events_lockEnable_title": "Listen to lock events",
"edt_conf_os_events_lockEnable_expl": "Listen to screen lock/unlock events",
"edt_conf_os_events_suspendEnable_title": "Listen to suspend events",
"edt_conf_os_events_suspendEnable_expl": "Listen to operating system suspend/resume events",
"edt_conf_os_events_suspendOnLockEnable_title": "Suspend when locked",
"edt_conf_os_events_suspendOnLockEnable_expl": "Suspend when the screen is locked, otherwise go into idle mode",
"edt_conf_pbs_heading_title": "Protocol Buffers Server",
"edt_conf_pbs_timeout_expl": "If no data are received for the given period, the component will be (soft) disabled.",
"edt_conf_pbs_timeout_title": "Timeout",
"edt_conf_sched_actions_header_title": "Actions",
"edt_conf_sched_actions_header_expl": "Define which action should take place on a point in time. The action will be scheduled daily.",
"edt_conf_sched_actions_header_item_title": "Action",
"edt_conf_smooth_continuousOutput_expl": "Update the LEDs even there is no changed picture.",
"edt_conf_smooth_continuousOutput_title": "Continuous output",
"edt_conf_smooth_decay_expl": "The speed of decay. 1 is linear, greater values are have stronger effect.",
@ -472,6 +541,8 @@
"edt_conf_smooth_updateDelay_title": "Output delay",
"edt_conf_smooth_updateFrequency_expl": "The output speed to your LED controller.",
"edt_conf_smooth_updateFrequency_title": "Update frequency",
"edt_conf_time_event_title": "Time",
"edt_conf_time_event_expl": "Point in time that will trigger an action",
"edt_conf_v4l2_blueSignalThreshold_expl": "Darkens low blue values (recognized as black)",
"edt_conf_v4l2_blueSignalThreshold_title": "Blue signal threshold",
"edt_conf_v4l2_cecDetection_expl": "If enabled, USB capture will be temporarily disabled when CEC standby event received from HDMI bus.",
@ -531,27 +602,6 @@
"edt_conf_v4l2_hardware_set_defaults_tip": "Set device's default values for brightness, contrast, hue and saturation",
"edt_conf_v4l2_noSignalCounterThreshold_title": "Signal Counter Threshold",
"edt_conf_v4l2_noSignalCounterThreshold_expl": "Count of frames (check that with grabber's current FPS mode) after which the no signal is triggered",
"edt_conf_audio_device_expl": "Selected audio input device",
"edt_conf_audio_device_title": "Audio Device",
"edt_conf_audio_effects_expl": "Select an effect on how the audio signal is transformed to",
"edt_conf_audio_effects_title": "Audio Effects",
"edt_conf_audio_effect_enum_vumeter": "VU-Meter",
"edt_conf_audio_effect_hotcolor_expl": "Hot Color",
"edt_conf_audio_effect_hotcolor_title": "Hot Color",
"edt_conf_audio_effect_multiplier_expl": "Audio Signal Value multiplier",
"edt_conf_audio_effect_multiplier_title": "Multiplier",
"edt_conf_audio_effect_safecolor_expl": "Safe Color",
"edt_conf_audio_effect_safecolor_title": "Safe Color",
"edt_conf_audio_effect_safevalue_expl": "Safe Threshold",
"edt_conf_audio_effect_safevalue_title": "Safe Threshold",
"edt_conf_audio_effect_set_defaults": "Reset to default values",
"edt_conf_audio_effect_tolerance_expl": "Tolerance used when auto calculating a signal multipler from 0-100",
"edt_conf_audio_effect_tolerance_title": "Tolerance",
"edt_conf_audio_effect_warncolor_expl": "Warning Color",
"edt_conf_audio_effect_warncolor_title": "Warning Color",
"edt_conf_audio_effect_warnvalue_expl": "Warning Threshold",
"edt_conf_audio_effect_warnvalue_title": "Warning Threshold",
"edt_conf_audio_heading_title": "Audio Capture",
"edt_conf_webc_crtPath_expl": "Path to the certification file (format should be PEM)",
"edt_conf_webc_crtPath_title": "Certificate path",
"edt_conf_webc_docroot_expl": "Local webinterface root path (just for webui developer)",
@ -561,10 +611,12 @@
"edt_conf_webc_keyPassPhrase_title": "Key password",
"edt_conf_webc_keyPath_expl": "Path to the key file (format PEM, encrypted with RSA)",
"edt_conf_webc_keyPath_title": "Private key path",
"edt_conf_webc_sslport_expl": "Port oft the HTTPS-Webserver",
"edt_conf_webc_port_expl": "Port for the WebServer, RPC and WebSocket HTTP connections",
"edt_conf_webc_port_title": "HTTP Port",
"edt_conf_webc_sslport_expl": "Port for the WebServer, RPC and WebSocket HTTPS connections",
"edt_conf_webc_sslport_title": "HTTPS Port",
"edt_dev_auth_key_title": "Authentication Token",
"edt_dev_auth_key_title_info": "Authentication Token required to acccess the device",
"edt_dev_auth_key_title": "Authorization Token",
"edt_dev_auth_key_title_info": "Authorization Token required to acccess the device",
"edt_dev_enum_sub_min_cool_adjust": "Subtract cool white",
"edt_dev_enum_sub_min_warm_adjust": "Subtract warm white",
"edt_dev_enum_subtract_minimum": "Subtract minimum",
@ -622,7 +674,7 @@
"edt_dev_spec_gpioBcm_title": "GPIO Pin",
"edt_dev_spec_gpioMap_title": "GPIO mapping",
"edt_dev_spec_gpioNumber_title": "GPIO number",
"edt_dev_spec_groupId_title": "Group ID",
"edt_dev_spec_groupId_title": "Group",
"edt_dev_spec_header_title": "Specific Settings",
"edt_dev_spec_interpolation_title": "Interpolation",
"edt_dev_spec_intervall_title": "Interval",
@ -687,6 +739,7 @@
"edt_dev_spec_transistionTime_title": "Transition time",
"edt_dev_spec_uid_title": "UID",
"edt_dev_spec_universe_title": "Universe",
"edt_dev_spec_useAPIv2_title": "Use API v2",
"edt_dev_spec_useEntertainmentAPI_title": "Use Hue Entertainment API",
"edt_dev_spec_useOrbSmoothing_title": "Use orb smoothing",
"edt_dev_spec_useRgbwProtocol_title": "Use RGBW protocol",
@ -710,17 +763,17 @@
"edt_eff_collision_header": "color collision",
"edt_eff_collision_header_desc": "Two color projectiles are sent from random positions and collide with each other",
"edt_eff_color": "Color",
"edt_eff_colorHour": "Color hour",
"edt_eff_colorHour": "Color hours",
"edt_eff_colorMarker": "Marker color",
"edt_eff_colorMinute": "Color minute",
"edt_eff_colorSecond": "Color second",
"edt_eff_colorMinute": "Color minutes",
"edt_eff_colorSecond": "Color seconds",
"edt_eff_colorcount": "Color length",
"edt_eff_colorend": "Color end",
"edt_eff_colorendtime": "Time to hold start color",
"edt_eff_colorevel": "Color level",
"edt_eff_colorone": "Color one",
"edt_eff_colorrandom": "Random color",
"edt_eff_colorshift": "Color Shift",
"edt_eff_colorshift": "Color shift",
"edt_eff_colorstart": "Color start",
"edt_eff_colorstarttime": "Time to hold end color",
"edt_eff_colortwo": "Color two",
@ -759,6 +812,8 @@
"edt_eff_ledlist": "LED List",
"edt_eff_ledtest_header": "LED Test",
"edt_eff_ledtest_header_desc": "Rotating output: Red, Green, Blue, White, Black",
"edt_eff_ledtest_seq_header": "LED Test - Sequence",
"edt_eff_ledtest_seq_header_desc": "Light up the LEDs in sequence",
"edt_eff_length": "Length",
"edt_eff_lightclock_header": "Light Clock",
"edt_eff_lightclock_header_desc": "A real clock as light! Adjust the colors of hours, minute, seconds. A optional 3/6/9/12 o'clock marker is also available. In case the clock is wrong, you need to check your system clock.",
@ -790,7 +845,7 @@
"edt_eff_reversedirection": "Reverse direction",
"edt_eff_rotationtime": "Rotation time",
"edt_eff_saturation": "Saturation",
"edt_eff_set_post_color": "Set post color after alam",
"edt_eff_set_post_color": "Set post color after alarm",
"edt_eff_showseconds": "Show seconds",
"edt_eff_sleeptime": "Sleep time",
"edt_eff_smooth_custom": "Enable smoothing",
@ -918,6 +973,7 @@
"general_country_us": "United States",
"general_disabled": "disabled",
"general_enabled": "enabled",
"general_speech_bg": "Bulgarian",
"general_speech_ca": "Catalan",
"general_speech_cs": "Czech",
"general_speech_da": "Danish",
@ -926,7 +982,9 @@
"general_speech_en": "English",
"general_speech_es": "Spanish",
"general_speech_fr": "French",
"general_speech_he": "Hebrew",
"general_speech_hu": "Hungarian",
"general_speech_id": "Indonesian",
"general_speech_it": "Italian",
"general_speech_ja": "Japanese",
"general_speech_nb": "Norwegian (Bokmål)",
@ -937,6 +995,7 @@
"general_speech_ru": "Russian",
"general_speech_sv": "Swedish",
"general_speech_tr": "Turkish",
"general_speech_uk": "Ukrainian",
"general_speech_vi": "Vietnamese",
"general_speech_zh-CN": "Chinese (simplified)",
"general_webui_title": "Hyperion - Web Configuration",
@ -980,6 +1039,8 @@
"main_menu_dashboard_token": "Dashboard",
"main_menu_effect_conf_token": "Effects",
"main_menu_effectsconfigurator_token": "Effects Configurator",
"main_menu_events": "Event Services",
"main_menu_event_services_token": "Event Services",
"main_menu_general_conf_token": "General",
"main_menu_grabber_conf_token": "Capturing Hardware",
"main_menu_input_selection_token": "Input Selection",
@ -1040,7 +1101,6 @@
"support_label_fbtext": "Share our Hyperion Facebook page and get a notice when new updates are released",
"support_label_forumtext": "Showcases, discussions, help and more",
"support_label_forumtitle": "Forum",
"support_label_ggtext": "Circle us on Google +!",
"support_label_ghtext": "Visit us on GitHub",
"support_label_igtext": "Visit us on Instagram to watch the latest Hyperion pictures!",
"support_label_intro": "Hyperion is a free, non-profit software. A small team is working on it and this is why we need your steady support.",
@ -1062,7 +1122,7 @@
"update_no_updates_for_branch": "No updates for selected version channel.",
"update_versreminder": "Your version: $1",
"wiz_atmoorb_desc2": "Now choose which Orbs should be added. The position assigns the lamp to a specific position on your \"picture\". Disabled lamps won't be added. To identify single lamps press the button on the right.",
"wiz_atmoorb_intro1": "This wizards configures Hyperion for AtmoOrbs. Features are the AtmoOrb auto detection, setting each light to a specific position on your picture or disable it and optimise the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
"wiz_atmoorb_intro1": "This wizard configures Hyperion for AtmoOrbs. Features are the AtmoOrb auto detection, setting each light to a specific position on your picture or disable it and optimise the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
"wiz_atmoorb_title": "AtmoOrb Wizard",
"wiz_cc_adjustgamma": "Gamma: What you have to do is, adjust gamma levels of each channel until you have the same perceived amount of each channel. Hint: Neutral is 1.0! For example, if your Grey is a bit reddish it means that you have to increase red gamma to reduce the amount of red (the more gamma, the less amount of color).",
"wiz_cc_adjustit": "Adjust your \"$1\", until your are fine with it. Take notice: The more you adjust away from the default value the color spectrum will be limited (Also for all colors in between). Depending on TV/LED color spectrum the results will vary.",
@ -1087,11 +1147,11 @@
"wiz_cc_testintrowok": "Check out the following link to download test videos:",
"wiz_cc_title": "Colour calibration wizard",
"wiz_cololight_desc2": "Now choose which Cololights should be added. To identify single lights, press the button on the right.",
"wiz_cololight_intro1": "This wizards configures Hyperion for the Cololight system. Features are the Cololight auto detection and tune the Hyperion settings automatically! In short: All you need are some clicks and you are done!<br />Note: In case of Cololight Strip, you might need to manually correct the LED count and layout.",
"wiz_cololight_intro1": "This wizard configures Hyperion for the Cololight system. Features are the Cololight auto detection and tune the Hyperion settings automatically! In short: All you need are some clicks and you are done!<br />Note: In case of Cololight Strip, you might need to manually correct the LED count and layout.",
"wiz_cololight_noprops": "Not able to get device properties - Define Hardware LED count manually",
"wiz_cololight_title": "Cololight Wizard",
"wiz_guideyou": "The $1 will guide you through the settings. Just press the button!",
"wiz_hue_blinkblue": "Let ID $1 light up blue",
"wiz_hue_blinkblue": "Let it light up",
"wiz_hue_clientkey": "Clientkey",
"wiz_hue_create_user": "Create new User",
"wiz_hue_desc1": "1. Hyperion searches automatically for a Hue-Bridge, in case it cannot find one you need to provide the hostname or IP-address and push the reload button. <br> 2. Provide a user ID, if you do not have one create a new one.",
@ -1101,7 +1161,7 @@
"wiz_hue_e_desc1": "1. Hyperion searches automatically for a Hue-Bridge, in case it cannot find one you need to provide the hostname or IP-address and push the reload button. <br> 2. Provide a user id and the clientkey, if you do not have both, create new ones.",
"wiz_hue_e_desc2": "3. Choose your entertainment group, which has all your lights inside for use with Hyperion.",
"wiz_hue_e_desc3": "4. Choose in which position the respective lamp should be \"in the picture\". A preselection of the position was made based on the configured positions of the lights in the entertainment group. This is just a recommendation and can be customized as desired. You can therefore highlight them briefly by clicking on the right button to improve the selection.",
"wiz_hue_e_intro1": "This wizards configures Hyperion for the well known Philips Hue Entertainment system. Features are: Hue Bridge auto detection, user and clientkey creation, entertainment group selection, setting group lights to a specific position on your picture and optimise the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
"wiz_hue_e_intro1": "This wizard configures Hyperion for the well known Philips Hue Entertainment system. Features are: Hue Bridge auto detection, user and clientkey creation, entertainment group selection, setting group lights to a specific position on your picture and optimise the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
"wiz_hue_e_noapisupport": "The Wizard has disabled entertainment API support and will continue in classic mode.",
"wiz_hue_e_noapisupport_hint": "The option \"<b>Use Hue Entertainment API</b>\" was unchecked.",
"wiz_hue_e_noegrpids": "No entertainment groups in this Hue bridge defined.",
@ -1112,7 +1172,7 @@
"wiz_hue_failure_connection": "Timeout: Please press the bridge button within the period of 30 seconds",
"wiz_hue_failure_ip": "No Bridge found, please provide a valid hostname or IP-address",
"wiz_hue_failure_user": "User not found, create a new one with the button below or input a valid user id and press the \"reload\" symbol.",
"wiz_hue_intro1": "This wizards configures Hyperion for the well known Philips Hue system. Features are Hue Bridge auto detection, user creation, set each hue light to a specific position on your picture or disable it and tune the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
"wiz_hue_intro1": "This wizard configures Hyperion for the well known Philips Hue system. Features are Hue Bridge auto detection, user creation, set each hue light to a specific position on your picture or disable it and tune the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
"wiz_hue_ip": "Hostname or IP",
"wiz_hue_noids": "This Hue bridge has no bulbs/stripes, please pair them before with the Hue Apps",
"wiz_hue_press_link": "Please press link button on the Hue Bridge.",
@ -1122,8 +1182,15 @@
"wiz_identify": "Identify",
"wiz_identify_tip": "Identify configured device by lighting it up",
"wiz_identify_light": "Identify $1",
"wiz_layout": "Generate Layout",
"wiz_layout_tip": "Generate a layout for the configured device",
"wiz_ids_disabled": "Deactivated",
"wiz_ids_entire": "Whole picture",
"wiz_nanoleaf_failure_auth_token": "Please press the Nanoleaf Power On/Off button within 30 seconds",
"wiz_nanoleaf_failure_auth_token_t": "User authorization token generating timeout",
"wiz_nanoleaf_press_onoff_button": "Please press the Power On/Off button on your Nanoleaf device for 5-7 seconds",
"wiz_nanoleaf_user_auth_intro": "The wizard supports you in generating a user authorization token required to allowing Hyperion to access the device.",
"wiz_nanoleaf_user_auth_title": "Authorization Token Generating Wizard",
"wiz_noLights": "No $1 found! Please get the lights connected to the network or configure them manually.",
"wiz_pos": "Position/State",
"wiz_rgb_expl": "The color dot switches every x seconds the color (red, green), at the same time your LEDs switch the color too. Answer the questions at the bottom to check/correct your byte order.",
@ -1137,7 +1204,7 @@
"wiz_cc_try_connect": "Connecting...",
"wiz_wizavail": "Wizard available",
"wiz_yeelight_desc2": "Now choose which lamps should be added. The position assigns the lamp to a specific position on your \"picture\". Disabled lamps won't be added. To identify single lamps press the button on the right.",
"wiz_yeelight_intro1": "This wizards configures Hyperion for the Yeelight system. Features are the Yeelighs' auto detection, setting each light to a specific position on your picture or disable it and tune the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
"wiz_yeelight_intro1": "This wizard configures Hyperion for the Yeelight system. Features are the Yeelights' auto detection, setting each light to a specific position on your picture or disable it and tune the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
"wiz_yeelight_title": "Yeelight Wizard",
"wiz_yeelight_unsupported": "Unsupported"
}

View File

@ -22,6 +22,8 @@
"about_resources": "$1 librerías",
"about_translations": "Traducciones",
"about_version": "Versión",
"conf_cec_events_heading_title": "Eventos CEC",
"conf_cec_events_intro": "Ajustes relacionados con los diferentes eventos del protocolo CEC (Consumer Electronics Control) que Hyperion puede gestionar",
"conf_colors_blackborder_intro": "Omite bordes negros dondequiera que estén. Cada modo usa otro algoritmo de detección que está ajustado para situaciones especiales. Sube el umbral si no percibes funcionamiento.",
"conf_colors_color_intro": "Crea uno o más perfiles de calibración, ajusta cada color, brillo, linealización y más.",
"conf_colors_smoothing_intro": "El suavizado aplana los cambios de color/brillo para reducir la distracción molesta.",
@ -44,6 +46,7 @@
"conf_general_inst_title": "Gestión de instalaciones de hardware LED",
"conf_general_intro": "Ajustes básicos de Hyperion y WebUI que no encajan en otra categoría.",
"conf_general_label_title": "Configuración general",
"conf_grabber_audio_intro": "La captura de audio utiliza un dispositivo de entrada como la fuente de visualización",
"conf_grabber_fg_intro": "La plataforma de captura es la captura del sistema local como fuente de entrada, en la que Hyperion está instalado.",
"conf_grabber_inst_grabber_config_info": "Configura de antemano los dispositivos de hardware de captura que utilizará la instancia",
"conf_grabber_v4l_intro": "La captura USB es un dispositivo (de captura) conectado a través de USB que se utiliza para introducir imágenes de origen para su procesado.",
@ -81,6 +84,8 @@
"conf_leds_layout_cl_bottomright": "Inferior Derecha (Esquina)",
"conf_leds_layout_cl_cornergap": "Hueco de esquina",
"conf_leds_layout_cl_edgegap": "Hueco de borde",
"conf_leds_layout_cl_entertainment": "Área de Entretenimiento",
"conf_leds_layout_cl_entertainment_center": "Centro del Área de Entretenimiento",
"conf_leds_layout_cl_gaglength": "Longitud de hueco",
"conf_leds_layout_cl_gappos": "Posición del hueco",
"conf_leds_layout_cl_hleddepth": "Profundidad LED Horizontal",
@ -110,7 +115,13 @@
"conf_leds_layout_cl_topright": "Superior Derecha (Esquina)",
"conf_leds_layout_cl_vleddepth": "Profundidad LED vertical",
"conf_leds_layout_frame": "Disposición Clásica (Marco LED)",
"conf_leds_layout_gapbottom": "Hueco Inferior",
"conf_leds_layout_gapleft": "Hueco izquierdo",
"conf_leds_layout_gapright": "Hueco derecho",
"conf_leds_layout_gaptop": "Hueco superior",
"conf_leds_layout_generatedconf": "Configuración LED Generada/Actual",
"conf_leds_layout_generation_error": "Trazado de LED no generado",
"conf_leds_layout_generation_success": "Trazado de LED generado correctamente",
"conf_leds_layout_intro": "Necesitas también un diseño led, que refleje tus posiciones led. La disposición clásica es el marco generalmente usado de la TV, pero también apoyamos la creación de matriz led (paredes led). La vista en esta disposición es SIEMPRE del FRENTE de tu TV.",
"conf_leds_layout_ma_cabling": "Cableado",
"conf_leds_layout_ma_direction": "Dirección",
@ -183,6 +194,10 @@
"conf_network_tok_intro": "Aquí puedes crear y eliminar Tokens para la autenticación de la API. Los Tokens creados sólo se mostrarán una vez.",
"conf_network_tok_lastuse": "Último uso",
"conf_network_tok_title": "Gestión de Tokens",
"conf_os_events_heading_title": "Eventos del sistema operativo",
"conf_os_events_intro": "Ajustes relacionados con diferentes eventos del sistema operativo que Hyperion puede gestionar",
"conf_sched_events_heading_title": "Eventos programados",
"conf_sched_events_intro": "Ajustes relacionados con eventos programados, es decir, basados en el tiempo, que Hyperion gestionará",
"conf_webconfig_label_intro": "Ajustes de configuración web. Editar sabiamente.",
"dashboard_active_instance": "Instalación seleccionada",
"dashboard_alert_message_confedit": "Se ha modificado la configuración de Hyperion. Para aplicarlo, reinicia Hyperion.",
@ -234,6 +249,30 @@
"edt_append_pixel": "Píxel",
"edt_append_s": "s",
"edt_append_sdegree": "s/grado",
"edt_conf_action_expl": "Acción a ser aplicada",
"edt_conf_action_record_validation_error": "Un mismo evento sólo puede desencadenar una acción. Limpiar Acciones $1",
"edt_conf_action_title": "Acción",
"edt_conf_audio_device_expl": "Dispositivo de entrada de audio seleccionado",
"edt_conf_audio_device_title": "Dispositivo de Audio",
"edt_conf_audio_effect_enum_vumeter": "Medidor-UV",
"edt_conf_audio_effect_hotcolor_expl": "Color Caliente",
"edt_conf_audio_effect_hotcolor_title": "Color Caliente",
"edt_conf_audio_effect_multiplier_expl": "Multiplicador de Valor de Señal de Audio",
"edt_conf_audio_effect_multiplier_title": "Multiplicador",
"edt_conf_audio_effect_safecolor_expl": "Color Seguro",
"edt_conf_audio_effect_safecolor_title": "Color Seguro",
"edt_conf_audio_effect_safevalue_expl": "Umbral de Seguridad",
"edt_conf_audio_effect_safevalue_title": "Umbral de Seguridad",
"edt_conf_audio_effect_set_defaults": "Restablecer valores por defecto",
"edt_conf_audio_effect_tolerance_expl": "Tolerancia utilizada al autocalcular un multiplicador de señal de 0-100",
"edt_conf_audio_effect_tolerance_title": "Tolerancia",
"edt_conf_audio_effect_warncolor_expl": "Color de Advertencia",
"edt_conf_audio_effect_warncolor_title": "Color de Advertencia",
"edt_conf_audio_effect_warnvalue_expl": "Umbral de Advertencia",
"edt_conf_audio_effect_warnvalue_title": "Umbral de Advertencia",
"edt_conf_audio_effects_expl": "Selecciona un efecto de como la señal de audio es transformada",
"edt_conf_audio_effects_title": "Efectos de Audio",
"edt_conf_audio_heading_title": "Captura de Audio",
"edt_conf_bb_blurRemoveCnt_expl": "Número de píxeles que se eliminan del borde detectado para cortar el desenfoque.",
"edt_conf_bb_blurRemoveCnt_title": "blurRemoveCnt",
"edt_conf_bb_borderFrameCnt_expl": "Número de fotogramas antes de que se establezca un borde detectado consistente.",
@ -249,6 +288,19 @@
"edt_conf_bb_unknownFrameCnt_title": "Fotogramas desconocidos",
"edt_conf_bge_heading_title": "Efecto/color de fondo",
"edt_conf_bobls_heading_title": "Servidor Boblight",
"edt_conf_cec_actions_header_expl": "Definir qué acción debe llevarse a cabo en un acontecimiento CEC reconocido",
"edt_conf_cec_actions_header_item_title": "Acción",
"edt_conf_cec_actions_header_title": "Acciones",
"edt_conf_cec_button_release_delay_ms_expl": "Tiempo de liberación del botón remoto",
"edt_conf_cec_button_release_delay_ms_title": "Tiempo de liberación del botón",
"edt_conf_cec_button_repeat_rate_ms_expl": "Tasa de repetición de botones remotos",
"edt_conf_cec_button_repeat_rate_ms_title": "Tasa de repetición de botones",
"edt_conf_cec_double_tap_timeout_ms_expl": "Retardo de pulsación de botón remoto antes de repetir",
"edt_conf_cec_double_tap_timeout_ms_title": "Retardo del botón antes de repetir",
"edt_conf_cec_event_expl": "Evento CEC que desencadenará una acción",
"edt_conf_cec_event_title": "Evento CEC",
"edt_conf_color_accuracyLevel_expl": "Nivel de precisión con el que se evalúan los colores dominantes. Un nivel más alto crea resultados más precisos, pero también requiere más potencia de procesamiento. Debe combinarse con un procesamiento de píxeles reducido.",
"edt_conf_color_accuracyLevel_title": "Nivel de precisión",
"edt_conf_color_backlightColored_expl": "Añade un poco de color a tu retroiluminación.",
"edt_conf_color_backlightColored_title": "Retroiluminación colorida",
"edt_conf_color_backlightThreshold_expl": "La cantidad mínima de brillo (retroiluminación). Desactivado durante los efectos, colores y en estado \"Apagado\"",
@ -287,6 +339,8 @@
"edt_conf_color_magenta_title": "magenta",
"edt_conf_color_red_expl": "El valor rojo calibrado.",
"edt_conf_color_red_title": "rojo",
"edt_conf_color_reducedPixelSetFactorFactor_expl": "Evaluar sólo un conjunto de píxeles por área LED definida, Bajo ~25%, Medio ~10%, Alto ~6%",
"edt_conf_color_reducedPixelSetFactorFactor_title": "Procesamiento de píxeles reducido",
"edt_conf_color_saturationGain_expl": "Ajusta la saturación de los colores. 1,0 significa que no hay cambios, más de 1,0 aumenta la saturación, menos de 1,0 disminuye la saturación.",
"edt_conf_color_saturationGain_title": "Ganancia de saturación",
"edt_conf_color_white_expl": "El valor blanco calibrado.",
@ -307,6 +361,13 @@
"edt_conf_enum_PAL": "PAL",
"edt_conf_enum_SECAM": "SECAM",
"edt_conf_enum_VERTICAL": "Vertical",
"edt_conf_enum_action_idle": "Inactivo",
"edt_conf_enum_action_restart": "Reiniciar",
"edt_conf_enum_action_resume": "Reanudar",
"edt_conf_enum_action_resumeIdle": "Reanudar Inactividad",
"edt_conf_enum_action_suspend": "Suspender",
"edt_conf_enum_action_toggleIdle": "Alternar Inactividad",
"edt_conf_enum_action_toggleSuspend": "Alternar Suspension",
"edt_conf_enum_automatic": "Automático",
"edt_conf_enum_bbclassic": "Clásico",
"edt_conf_enum_bbdefault": "Predeterminado",
@ -315,9 +376,17 @@
"edt_conf_enum_bgr": "BGR",
"edt_conf_enum_bottom_up": "De abajo a arriba",
"edt_conf_enum_brg": "BRG",
"edt_conf_enum_cec_key_f1_blue": "Botón azul pulsado",
"edt_conf_enum_cec_key_f2_red": "Botón rojo pulsado",
"edt_conf_enum_cec_key_f3_green": "Botón verde pulsado",
"edt_conf_enum_cec_key_f4_yellow": "Botón amarillo pulsado",
"edt_conf_enum_cec_opcode_set stream path": "TV encendida",
"edt_conf_enum_cec_opcode_standby": "TV apagada",
"edt_conf_enum_color": "Color",
"edt_conf_enum_custom": "Personalizado",
"edt_conf_enum_decay": "Degradación",
"edt_conf_enum_delay": "Sólo retardo",
"edt_conf_enum_disabled": "Deshabilitado",
"edt_conf_enum_dl_error": "Error",
"edt_conf_enum_dl_informational": "Informativo",
"edt_conf_enum_dl_nodebug": "No hay depuración",
@ -326,9 +395,12 @@
"edt_conf_enum_dl_verbose1": "Verbosidad nivel 1",
"edt_conf_enum_dl_verbose2": "Verbosidad nivel 2",
"edt_conf_enum_dl_verbose3": "Verbosidad nivel 3",
"edt_conf_enum_dominant_color": "Color Dominante - por LED",
"edt_conf_enum_dominant_color_advanced": "Color Dominante Avanzado - por LED",
"edt_conf_enum_effect": "Efecto",
"edt_conf_enum_gbr": "GBR",
"edt_conf_enum_grb": "GRB",
"edt_conf_enum_high": "Alto",
"edt_conf_enum_hsv": "HSV",
"edt_conf_enum_left_right": "De izquierda a derecha",
"edt_conf_enum_linear": "Lineal",
@ -336,7 +408,10 @@
"edt_conf_enum_logsilent": "Silenciado",
"edt_conf_enum_logverbose": "Detallado",
"edt_conf_enum_logwarn": "Advertencia",
"edt_conf_enum_low": "Bajo",
"edt_conf_enum_medium": "Medio",
"edt_conf_enum_multicolor_mean": "Multicolor",
"edt_conf_enum_multicolor_mean_squared": "Color Medio al cuadrado - por LED",
"edt_conf_enum_please_select": "Por favor, elije",
"edt_conf_enum_rbg": "RBG",
"edt_conf_enum_rgb": "RGB",
@ -405,6 +480,8 @@
"edt_conf_grabber_discovered_title": "Dispositivo descubierto",
"edt_conf_grabber_discovered_title_info": "Selecciona tu dispositivo de captura descubierto",
"edt_conf_grabber_discovery_inprogress": "Descubrimiento en curso",
"edt_conf_instC_audioEnable_expl": "Habilita la captura de Audio para esta estancia de hardware LED",
"edt_conf_instC_audioEnable_title": "Habilitar captura de Audio",
"edt_conf_instC_screen_grabber_device_expl": "El dispositivo de captura de pantalla utilizado",
"edt_conf_instC_screen_grabber_device_title": "Dispositivo de captura de pantalla",
"edt_conf_instC_systemEnable_expl": "Permite la captura de pantalla para esta instalación de hardware Led",
@ -419,22 +496,28 @@
"edt_conf_log_level_expl": "Dependiendo del nivel de registro verás menos o más mensajes en tu registro.",
"edt_conf_log_level_title": "Nivel de registro",
"edt_conf_net_apiAuth_expl": "Imponer a todas las aplicaciones que utilizan la API de Hyperion a autenticarse contra Hyperion (Excepción: \"Autenticación de la API local\"). Mayor seguridad, ya que se controla el acceso y se revoca en cualquier momento.",
"edt_conf_net_apiAuth_title": "Autenticación de API",
"edt_conf_net_heading_title": "Red",
"edt_conf_net_internetAccessAPI_expl": "Permite el acceso a la API/interfaz web de Hyperion desde Internet, desactivado para mayor seguridad.",
"edt_conf_net_internetAccessAPI_title": "Acceso a la API de Internet",
"edt_conf_net_ipWhitelist_expl": "Puedes hacer una lista blanca de direcciones IP en vez de permitir que todas las conexiones de internet se conecten a la API/Webinterface de Hyperion.",
"edt_conf_net_ipWhitelist_title": "IPs de la lista blanca",
"edt_conf_net_ip_itemtitle": "IP",
"edt_conf_net_localAdminAuth_expl": "Cuando está habilitado, el acceso de administración desde tu red local necesita una contraseña.",
"edt_conf_net_localAdminAuth_title": "Autenticación de la API de administración local",
"edt_conf_net_localApiAuth_expl": "Cuando está habilitado, las conexiones de tu red doméstica también necesitan autenticarse contra Hyperion.",
"edt_conf_net_localApiAuth_title": "Autenticación de API local",
"edt_conf_net_restirctedInternetAccessAPI_expl": "Puedes restringir el acceso a la API a través de Internet a determinadas IP.",
"edt_conf_net_restirctedInternetAccessAPI_title": "Restringir a las IP",
"edt_conf_os_events_lockEnable_expl": "Escuchar eventos de bloqueo/desbloqueo",
"edt_conf_os_events_lockEnable_title": "Escuchar eventos de bloqueo",
"edt_conf_os_events_suspendEnable_expl": "Escuchar eventos de suspension/resumen del sistema operativo",
"edt_conf_os_events_suspendEnable_title": "Escuchar eventos de suspensión",
"edt_conf_os_events_suspendOnLockEnable_expl": "Suspender cuando la pantalla está bloqueada, de lo contrario pasa al modo inactivo",
"edt_conf_os_events_suspendOnLockEnable_title": "Suspender cuando esté bloqueado",
"edt_conf_pbs_heading_title": "Servidor de Buffers de Protocolo",
"edt_conf_pbs_timeout_expl": "Si no se reciben datos para el período dado, el componente se desactivará (suavemente).",
"edt_conf_pbs_timeout_title": "Tiempo de espera",
"edt_conf_sched_actions_header_expl": "Defina qué acción debe tener lugar en un momento determinado. La acción se programará diariamente.",
"edt_conf_sched_actions_header_item_title": "Acción",
"edt_conf_sched_actions_header_title": "Acciones",
"edt_conf_smooth_continuousOutput_expl": "Actualizar los LED incluso si no hay cambio de imagen.",
"edt_conf_smooth_continuousOutput_title": "Salida continua",
"edt_conf_smooth_decay_expl": "La velocidad de degradación. 1 es lineal, los valores mayores tienen un efecto más fuerte.",
@ -452,6 +535,8 @@
"edt_conf_smooth_updateDelay_title": "Retardo de actualización",
"edt_conf_smooth_updateFrequency_expl": "La velocidad de salida a tu controlador led.",
"edt_conf_smooth_updateFrequency_title": "Frecuencia de actualización",
"edt_conf_time_event_expl": "Momento que desencadenará una acción",
"edt_conf_time_event_title": "Tiempo",
"edt_conf_v4l2_blueSignalThreshold_expl": "Oscurece los valores bajos de color azul (reconocidos como negros)",
"edt_conf_v4l2_blueSignalThreshold_title": "Umbral de señal azul",
"edt_conf_v4l2_cecDetection_expl": "Si está activado, la captura USB se desactivará temporalmente cuando el evento de espera de CEC se reciba desde el bus HDMI.",
@ -520,10 +605,12 @@
"edt_conf_webc_keyPassPhrase_title": "Contraseña clave",
"edt_conf_webc_keyPath_expl": "Ruta al archivo de clave (formato PEM, encriptado con RSA)",
"edt_conf_webc_keyPath_title": "Ruta de la clave privada",
"edt_conf_webc_port_expl": "Puerto del WebServer, RPC y conexiones HTTP WebSocket",
"edt_conf_webc_port_title": "Puerto HTTP",
"edt_conf_webc_sslport_expl": "Puerto del servidor web HTTPS",
"edt_conf_webc_sslport_title": "Puerto HTTPS",
"edt_dev_auth_key_title": "Token de autenticación",
"edt_dev_auth_key_title_info": "Token de autenticación necesario para acceder al dispositivo",
"edt_dev_auth_key_title": "Token de Autorización",
"edt_dev_auth_key_title_info": "Token de Autorización requerido para acceder al dispositivo",
"edt_dev_enum_sub_min_cool_adjust": "Min. Ajuste fresco",
"edt_dev_enum_sub_min_warm_adjust": "Min. Ajuste caliente",
"edt_dev_enum_subtract_minimum": "Restar el mínimo",
@ -576,7 +663,7 @@
"edt_dev_spec_gpioBcm_title": "Pin GPIO",
"edt_dev_spec_gpioMap_title": "Mapeo GPIO",
"edt_dev_spec_gpioNumber_title": "Número GPIO",
"edt_dev_spec_groupId_title": "ID de grupo",
"edt_dev_spec_groupId_title": "Grupo",
"edt_dev_spec_header_title": "Ajustes Específicos",
"edt_dev_spec_interpolation_title": "Interpolación",
"edt_dev_spec_intervall_title": "Intervalo",
@ -641,6 +728,7 @@
"edt_dev_spec_transistionTime_title": "Tiempo de transición",
"edt_dev_spec_uid_title": "UID",
"edt_dev_spec_universe_title": "Universo",
"edt_dev_spec_useAPIv2_title": "Usar API v2",
"edt_dev_spec_useEntertainmentAPI_title": "Usar la API de entretenimiento de Hue",
"edt_dev_spec_useOrbSmoothing_title": "Utilizar suavizado de orbe",
"edt_dev_spec_useRgbwProtocol_title": "Utilizar el protocolo RGBW",
@ -712,6 +800,8 @@
"edt_eff_ledlist": "Lista Led",
"edt_eff_ledtest_header": "Prueba de Led",
"edt_eff_ledtest_header_desc": "Salida giratoria: Rojo, Azul, Verde, Blanco, Negro",
"edt_eff_ledtest_seq_header": "Test LED - Secuencia",
"edt_eff_ledtest_seq_header_desc": "Encender los LED en secuencia",
"edt_eff_length": "Longitud",
"edt_eff_lightclock_header": "Reloj de luz",
"edt_eff_lightclock_header_desc": "¡Un verdadero reloj como la luz! Ajustar los colores de las horas, los minutos, los segundos. También hay disponible un marcador opcional de 3/6/9/12 en punto. En caso de que el reloj esté equivocado, debes revisar el reloj de tu sistema.",
@ -851,6 +941,7 @@
"general_col_blue": "azul",
"general_col_green": "verde",
"general_col_red": "rojo",
"general_comp_AUDIO": "Captura de Audio",
"general_comp_BLACKBORDER": "Detección de bordes negros",
"general_comp_BOBLIGHTSERVER": "Servidor Boblight",
"general_comp_FLATBUFSERVER": "Servidor de Flatbuffers",
@ -879,7 +970,9 @@
"general_speech_en": "Inglés",
"general_speech_es": "Español",
"general_speech_fr": "Francés",
"general_speech_he": "Hebreo",
"general_speech_hu": "Húngaro",
"general_speech_id": "Indonesio",
"general_speech_it": "Italiano",
"general_speech_ja": "Japonés",
"general_speech_nb": "Noruego (Bokmål)",
@ -890,6 +983,7 @@
"general_speech_ru": "Ruso",
"general_speech_sv": "Sueco",
"general_speech_tr": "Turco",
"general_speech_uk": "Ucraniano",
"general_speech_vi": "Vietnamita",
"general_speech_zh-CN": "Chino (simplificado)",
"general_webui_title": "Hyperion - Configuración Web",
@ -937,6 +1031,8 @@
"main_menu_dashboard_token": "Cuadro de mandos",
"main_menu_effect_conf_token": "Efectos",
"main_menu_effectsconfigurator_token": "Configurador de Efectos",
"main_menu_event_services_token": "Servicios de Evento",
"main_menu_events": "Servicios de Evento",
"main_menu_general_conf_token": "General",
"main_menu_grabber_conf_token": "Hardware de Captura",
"main_menu_input_selection_token": "Selección de entrada",
@ -974,7 +1070,10 @@
"remote_losthint": "Nota: Todos los cambios se pierden después de un reinicio.",
"remote_maptype_intro": "Normalmente la disposición de los leds define qué leds cubren un área específica de la imagen, puedes cambiarlo aquí: $1.",
"remote_maptype_label": "Tipo de Mapeo",
"remote_maptype_label_dominant_color": "Color Dominante",
"remote_maptype_label_dominant_color_advanced": "Color Dominante Avanzado",
"remote_maptype_label_multicolor_mean": "Multicolor",
"remote_maptype_label_multicolor_mean_squared": "Color medio al cuadrado",
"remote_maptype_label_unicolor_mean": "Unicolor",
"remote_optgroup_syseffets": "Efectos de Sistema",
"remote_optgroup_templates_custom": "Plantillas de Usuario",
@ -994,7 +1093,6 @@
"support_label_fbtext": "Comparte nuestra página de Hyperion en Facebook y obten un aviso cuando se publiquen nuevas actualizaciones",
"support_label_forumtext": "Casos de ejemplo, discusiones, ayuda y mucho más",
"support_label_forumtitle": "Foro",
"support_label_ggtext": "¡Haznos un círculo en Google+!",
"support_label_ghtext": "Visitanos en Github",
"support_label_igtext": "¡Visítanos en Instagram para ver las últimas imágenes de Hyperion!",
"support_label_intro": "Hyperion es un software libre sin fines de lucro. Un pequeño equipo está trabajando en ello y es por eso que necesitamos tu apoyo constante.",
@ -1046,7 +1144,7 @@
"wiz_cololight_noprops": "Imposible obtener las propiedades del dispositivo - Define el conteo de LEDs de hardware manualmente",
"wiz_cololight_title": "Asistente Cololight",
"wiz_guideyou": "El $1 te guiará a través de los ajustes. Simplemente ¡presiona el botón!",
"wiz_hue_blinkblue": "Permite a ID $1 encender el azul",
"wiz_hue_blinkblue": "Deja que se ilumine",
"wiz_hue_clientkey": "Llave de cliente:",
"wiz_hue_create_user": "Crear Usuario",
"wiz_hue_desc1": "1. Busca automáticamente un puente Hue, en caso de que no encuentre uno necesitas proporcionar la dirección IP y pulsar el botón de recarga a la derecha. Ahora necesitas una identificación de usuario, si no tienes una, crea una nueva.",
@ -1079,6 +1177,13 @@
"wiz_identify_tip": "Identificar el dispositivo configurado iluminándolo",
"wiz_ids_disabled": "Desactivado",
"wiz_ids_entire": "Toda la imagen",
"wiz_layout": "Generar Trazado",
"wiz_layout_tip": "Generar un diseño para el dispositivo configurado",
"wiz_nanoleaf_failure_auth_token": "Pulse el botón de encendido/apagado de Nanoleaf antes de 30 segundos.",
"wiz_nanoleaf_failure_auth_token_t": "Tiempo de espera de generación de token de autorización de usuario",
"wiz_nanoleaf_press_onoff_button": "Pulsa el botón de encendido/apagado de su dispositivo Nanoleaf durante 5-7 segundos",
"wiz_nanoleaf_user_auth_intro": "El asistente ayuda a generar un token de autorización de usuario necesario para que Hyperion pueda acceder al dispositivo.",
"wiz_nanoleaf_user_auth_title": "Asistente para generar tokens de autorización",
"wiz_noLights": "¡No se encontró $1! Por favor, conecta las luces a la red o configúralas manualmente.",
"wiz_pos": "Posición/Estado",
"wiz_rgb_expl": "El punto de color cambia cada x segundos el color (rojo, verde), al mismo tiempo que tus leds cambian el color también. Responde las preguntas en la parte inferior para verificar/corregir tu orden de bytes.",

View File

@ -5,11 +5,16 @@
"InfoDialog_changePassword_title": "Modifier le mot de passe",
"InfoDialog_iswitch_text": "Si vous faites fonctionner plus d'une instance Hyperion sur votre réseau local, vous pouvez basculer entre les différentes configurations. Sélectionnez l'instance d'Hyperion que vous souhaitez contrôler ci-dessous !",
"InfoDialog_iswitch_title": "Commutateur Hyperion",
"InfoDialog_nostorage_text": "Votre navigateur ne prend pas en charge localStorage. Il n'est pas possible d'enregistrer un paramètre de langue spécifique (retour à la détection automatique) et un niveau d'accès (retour à la valeur par défaut). Certains assistants peuvent être cachés. Vous pouvez toujours utiliser l'interface web sans autre problème",
"InfoDialog_nostorage_title": "Impossible d'ecrire les paramètres",
"InfoDialog_nowrite_foottext": "WebUI sera débloqué automatiquement une fois les problèmes résolus !",
"InfoDialog_nowrite_text": "Hyperion ne peut pas écrire votre fichier de configuration actuellement chargé. Réparez les permissions sur le fichier afin de poursuivre.",
"InfoDialog_nowrite_title": "Erreur de droit d'écriture !",
"InfoDialog_systemRestart_title": "Redémarrer",
"InfoDialog_systemResume_title": "reprendre",
"InfoDialog_systemSuspend_title": "Suspendre",
"about_3rd_party_licenses": "Licences tierces",
"about_3rd_party_licenses_error": "Nous avons eu des difficultés à collecter les informations de licences tiers sur le web. <br/> Suivez ce lien vers GitHub.",
"about_build": "Build",
"about_builddate": "Date du build",
"about_contribute": "Développez Hyperion avec nous !",
@ -39,21 +44,33 @@
"conf_general_inst_title": "Gestion des instances de LED",
"conf_general_intro": "Configuration basique pour Hyperion et WebUI ne rentrant dans aucune autre catégorie.",
"conf_general_label_title": "Réglages généraux",
"conf_grabber_audio_intro": "La capture audio utilise un dispositif d'entrée audio comme source de visualisation.",
"conf_grabber_fg_intro": "La capture d'écran correspond à l'image affichée par l'appareil sur lequel est installé Hyperion.",
"conf_grabber_inst_grabber_config_info": "Configurez à l'avance vos périphériques de capture pour qu'ils soient utilisés par l'instance.",
"conf_grabber_v4l_intro": "La capture USB utilise un périphérique de capture connecté en USB au système pour obtenir la source d'images à traiter.",
"conf_helptable_expl": "Explication",
"conf_helptable_option": "Option",
"conf_leds_config_error": "Erreur dans la configuration de la disposition",
"conf_leds_config_warning": "Verifiez la configuration de la disposition des LEDs",
"conf_leds_contr_label_contrtype": "Type de contrôleur : ",
"conf_leds_contr_label_contrtype": "Type de contrôleur: ",
"conf_leds_device_info_log": "Si vos LED ne fonctionnent pas, vérifiez ici s'il y a des erreurs :",
"conf_leds_device_intro": "Hyperion prend en charge de nombreux contrôleurs pour transmettre des données à votre appareil cible. Sélectionnez un contrôleur LED dans la liste triée et configurez-le. Nous avons choisi les meilleurs paramètres par défaut pour chaque appareil.",
"conf_leds_error_get_properties_text": "Erreur lors de l'obtention des propriétés de l'appareil. Veuillez vérifier les éléments de configuration.",
"conf_leds_error_get_properties_title": "Propriétés du périphérique",
"conf_leds_error_hwled_gt_layout": "Le nombre de DEL matérielles ($1) est supérieur au nombre de DEL configurées via la configuration ($2),<br>$3 {{plural:$3|LED|LEDs}} restera noir si vous continuez.",
"conf_leds_error_hwled_gt_maxled": "Le nombre de LED matérielles ($1) est supérieur au nombre maximum de LED pris en charge par le périphérique ($2). <br> Le nombre de LED matérielles est réglé sur ($3).",
"conf_leds_error_hwled_gt_maxled_protocol": "Le nombre de LED matérielles ($1) est supérieur au nombre maximum de LED pris en charge par le protocole de diffusion en continu ($2). <br> Le protocole de streaming sera remplacé par ($3).",
"conf_leds_error_hwled_lt_layout": "La quantité de LED ($1) est inférieure à celle des LED configurées via la disposition ($2). <br> Le nombre de LED configurées dans la disposition ne doit pas dépasser le nombre de LED disponibles.",
"conf_leds_error_wled_segment_missing": "Le segment actuellement configuré ($1) n'est pas configuré sur votre appareil WLED.<br>Vous devez peut-être vérifier la configuration du WLED!<br>La page de configuration représente la configuration actuelle du WLED.",
"conf_leds_info_ws281x": "Hyperion doit fonctionner avec les privilèges \"root\" pour ce type de contrôleur !",
"conf_leds_layout_advanced": "Réglages avancés",
"conf_leds_layout_blacklist_num_title": "Nombre de LEDs",
"conf_leds_layout_blacklist_rule_title": "Règle de liste noire",
"conf_leds_layout_blacklist_rules_title": "Règles de liste noire",
"conf_leds_layout_blacklist_start_title": "Démarrer LED",
"conf_leds_layout_blacklistleds_title": "Blacklister des LED",
"conf_leds_layout_btn_checklist": "Afficher la checklist",
"conf_leds_layout_btn_keystone": "Correction du trapèze",
"conf_leds_layout_button_savelay": "Sauvegarder la disposition",
"conf_leds_layout_button_updsim": "Mettre à jour la prévisualisation",
"conf_leds_layout_checkp1": "La LED noire est votre première LED, la première LED est le point d'entrée du signal de données.",
@ -65,6 +82,7 @@
"conf_leds_layout_cl_bottomright": "Bas droit (Coin)",
"conf_leds_layout_cl_cornergap": "Écart aux coins",
"conf_leds_layout_cl_edgegap": "Écart aux bords",
"conf_leds_layout_cl_entertainment": "Espace de divertissement",
"conf_leds_layout_cl_gaglength": "Taille de l'écart",
"conf_leds_layout_cl_gappos": "Position de l'écart",
"conf_leds_layout_cl_hleddepth": "Profondeur LED horizontale",
@ -73,6 +91,16 @@
"conf_leds_layout_cl_leftbottom": "Gauche 50%-100% Bas",
"conf_leds_layout_cl_leftmiddle": "Gauche 25%-75% Milieu",
"conf_leds_layout_cl_lefttop": "Gauche 0%-50% Haut",
"conf_leds_layout_cl_lightPosBottomLeft11": "Bas : 75 - 100 % à partir de la gauche",
"conf_leds_layout_cl_lightPosBottomLeft112": "Bas : 0 - 50 % à partir de la gauche",
"conf_leds_layout_cl_lightPosBottomLeft12": "Bas : 25 - 50 % à partir de la gauche",
"conf_leds_layout_cl_lightPosBottomLeft121": "Bas : 50 - 100 % à partir de la gauche",
"conf_leds_layout_cl_lightPosBottomLeft14": "Bas : 0 - 25 % à partir de la gauche",
"conf_leds_layout_cl_lightPosBottomLeft34": "Bas : 50 - 75 % à partir de la gauche",
"conf_leds_layout_cl_lightPosBottomLeftNewMid": "Bas : 25 - 75 % à partir de la gauche",
"conf_leds_layout_cl_lightPosTopLeft112": "Haut : 0 - 50 % à partir de la gauche",
"conf_leds_layout_cl_lightPosTopLeft121": "Haut : 50 - 100 % à partir de la gauche",
"conf_leds_layout_cl_lightPosTopLeftNewMid": "Haut : 25 - 75 % à partir de la gauche",
"conf_leds_layout_cl_overlap": "Chevauchement",
"conf_leds_layout_cl_reversdir": "Inverser le sens",
"conf_leds_layout_cl_right": "Droite",
@ -113,11 +141,13 @@
"conf_leds_layout_preview_totalleds": "Nombre total de LED : $1",
"conf_leds_layout_ptl": "Point en haut à gauche",
"conf_leds_layout_ptlh": "Horizontale",
"conf_leds_layout_ptln": "Points triples",
"conf_leds_layout_ptlv": "Verticale",
"conf_leds_layout_ptr": "Point en haut à droite",
"conf_leds_layout_textf1": "Ce champ montre (par défaut) votre disposition actuellement chargée et sera écrasée si vous en générez une nouvelle avec les options ci-dessus. Vous pourrez également y apporter des modifications par la suite.",
"conf_leds_nav_label_ledcontroller": "Contrôleur LED",
"conf_leds_nav_label_ledlayout": "Disposition des LED",
"conf_leds_note_layout_overwrite": "Note : Overwrite crée une disposition par défaut pour {{plural:1$| une LED| toutes les LED à $1}} en fonction du nombre de LED du matériel",
"conf_leds_optgroup_RPiGPIO": "RPi GPIO",
"conf_leds_optgroup_RPiPWM": "RPi PWM",
"conf_leds_optgroup_RPiSPI": "RPi SPI",
@ -131,6 +161,7 @@
"conf_logging_contpolicy": "la politique de confidentialité des rapports",
"conf_logging_label_intro": "Zone pour vérifier les messages du journal, plus ou moins d'informations seront affichées en fonction du niveau de journalisation réglé.",
"conf_logging_lastreports": "Rapports précédents",
"conf_logging_logoutput": "Sortie de journal",
"conf_logging_nomessage": "Pas de message disponible dans le journal.",
"conf_logging_report": "Rapport",
"conf_logging_uplfailed": "Échec du téléchargement ! Veuillez vérifier votre connexion Internet !",
@ -146,8 +177,12 @@
"conf_network_proto_intro": "Le port pour PROTO de toutes les instances d'Hyperion, utilisé pour les flux d'images (HyperionScreenCap, Extensions Kodi, Android Hyperion Grabber, ...)",
"conf_network_tok_cidhead": "Description",
"conf_network_tok_comment_title": "Description du token",
"conf_network_tok_desc": "Les \"tokens\" permettent à d'autres applications d'accéder à l'API Hyperion : Une application peut demander un jeton que vous devez accepter, ou vous pouvez en créer vous-même ci-dessous. Ces \"tokens\" ne sont nécessaires que lorsque l'option \"API Authorization\" est activée dans les paramètres de réseau.",
"conf_network_tok_diaMsg": "Voici votre nouveau token, que vous pouvez utiliser pour autoriser à une application l'accès à l'API Hyperion. Pour des raisons de sécurité vous ne pouvez pas y accéder de nouveau, donc notez-le.",
"conf_network_tok_diaTitle": "Le nouveau token a été créé !",
"conf_network_tok_grantMsg": "Une application a demandé un token pour accéder à l'API Hyperion. Voulez-vous accorder l'accès ? Veuillez vérifier les informations fournies !",
"conf_network_tok_grantT": "Token d'accès à l'application",
"conf_network_tok_intro": "Ici vous pouvez créer et supprimer des tokens pour l'authentification API. Les tokens créés ne seront visibles qu'une fois.",
"conf_network_tok_lastuse": "Dernière utilisation",
"conf_network_tok_title": "Gestion des tokens",
"conf_webconfig_label_intro": "Réglages de la configuration web. Modifiez judicieusement.",
@ -159,30 +194,34 @@
"dashboard_alert_message_disabled": "Cette instance est actuellement désactivée ! Pour l'utiliser à nouveau, activez-la dans le tableau de bord.",
"dashboard_alert_message_disabled_t": "Instance matérielle LED désactivée",
"dashboard_componentbox_label_comp": "Composant",
"dashboard_componentbox_label_status": "Etat",
"dashboard_componentbox_label_status": "État",
"dashboard_componentbox_label_title": "Etat des composants",
"dashboard_infobox_label_currenthyp": "Votre version d'Hyperion : ",
"dashboard_infobox_label_currenthyp": "Votre version Hyperion : ",
"dashboard_infobox_label_disableh": "Désactiver l'instance : $1",
"dashboard_infobox_label_enableh": "Activer l'instance : $1",
"dashboard_infobox_label_instance": "Instance",
"dashboard_infobox_label_instance": "Instance:",
"dashboard_infobox_label_latesthyp": "Dernière version d'Hyperion : ",
"dashboard_infobox_label_platform": "Plateforme",
"dashboard_infobox_label_platform": "Plateforme:",
"dashboard_infobox_label_port_boblight": "Serveur Boblight :",
"dashboard_infobox_label_port_flat": "Flatbuffer:",
"dashboard_infobox_label_port_json": "Server-JSON:",
"dashboard_infobox_label_port_proto": "Protobuffer:",
"dashboard_infobox_label_ports": "Ports",
"dashboard_infobox_label_ports_websocket": "WebSocket (ws|wss):",
"dashboard_infobox_label_smartacc": "Accès simplifié",
"dashboard_infobox_label_statush": "Statut d'Hyperion : ",
"dashboard_infobox_label_smartacc": "Accès Intelligent",
"dashboard_infobox_label_statush": "Statut Hyperion : ",
"dashboard_infobox_label_title": "Information",
"dashboard_infobox_label_watchedversionbranch": "Branche surveillée :",
"dashboard_infobox_message_updatesuccess": "Vous utilisez la dernière version d'Hyperion.",
"dashboard_infobox_message_updatewarning": "Une nouvelle version d'Hyperion est disponible ! ($1)",
"dashboard_label_intro": "Ce dashboard vous donne une vue rapide sur l'état d'Hyperion.",
"dashboard_label_intro": "Ce dashboard vous donne une vue rapide sur l'état Hyperion",
"dashboard_message_default_password": "La WebUI utilise le mot de passe par défaut. Nous recommandons de le modifier.",
"dashboard_message_default_password_t": "Utilisation du mot de passe par défaut pour la WebUI",
"dashboard_message_do_not_show_again": "Ne plus afficher ce message",
"dashboard_message_global_setting": "Les réglages sur cette page sont indépendantes des instances. Tout changement sera global a toutes les instances.",
"dashboard_message_global_setting_t": "Réglage global",
"dashboard_newsbox_label_title": "Hyperion - Blog",
"dashboard_newsbox_noconn": "Impossible d'accéder au blog d'Hyperion. Votre connexion internet fonctionne-t-elle ?",
"dashboard_newsbox_noconn": "Impossible d'accéder au blog Hyperion. Votre connexion internet est fonctionnel ?",
"dashboard_newsbox_readmore": "Lire plus",
"dashboard_newsbox_visitblog": "Visiter le Blog d'Hyperion",
"edt_append_degree": "°",
@ -190,12 +229,34 @@
"edt_append_hz": "Hz",
"edt_append_leds": "LED",
"edt_append_ms": "ms",
"edt_append_ns": "ns",
"edt_append_percent": "%",
"edt_append_percent_h": "% hori",
"edt_append_percent_v": "% vert",
"edt_append_pixel": "Pixel",
"edt_append_s": "s",
"edt_append_sdegree": "s/degré",
"edt_conf_audio_device_expl": "Appareil d'entrée audio sélectionné",
"edt_conf_audio_device_title": "Périphérique audio",
"edt_conf_audio_effect_enum_vumeter": "VU-Mètre",
"edt_conf_audio_effect_hotcolor_expl": "Couleur chaude",
"edt_conf_audio_effect_hotcolor_title": "Couleur chaude",
"edt_conf_audio_effect_multiplier_expl": "Multiplicateur de la valeur du signal audio",
"edt_conf_audio_effect_multiplier_title": "Multiplicateur",
"edt_conf_audio_effect_safecolor_expl": "Couleur de sécurité",
"edt_conf_audio_effect_safecolor_title": "Couleur de sécurité",
"edt_conf_audio_effect_safevalue_expl": "Seuil de sécurité",
"edt_conf_audio_effect_safevalue_title": "Seuil de sécurité",
"edt_conf_audio_effect_set_defaults": "Réinitialiser les valeurs par défaut",
"edt_conf_audio_effect_tolerance_expl": "Tolérance utilisée lors du calcul automatique d'un multiplicateur de signaux de 0 à 100",
"edt_conf_audio_effect_tolerance_title": "Tolérance",
"edt_conf_audio_effect_warncolor_expl": "Couleur d'avertissement",
"edt_conf_audio_effect_warncolor_title": "Couleur d'avertissement",
"edt_conf_audio_effect_warnvalue_expl": "Seuil d'avertissement",
"edt_conf_audio_effect_warnvalue_title": "Seuil d'avertissement",
"edt_conf_audio_effects_expl": "Sélectionner un effet sur la façon dont le signal audio est transformé en",
"edt_conf_audio_effects_title": "Effets audio",
"edt_conf_audio_heading_title": "Capture de son",
"edt_conf_bb_blurRemoveCnt_expl": "Nombre de pixel supprimés de la bordure détectée pour réduire le flou",
"edt_conf_bb_blurRemoveCnt_title": "Pixel flou",
"edt_conf_bb_borderFrameCnt_expl": "Nombre d'images avant la définition d'une bordure détectée cohérente",
@ -211,6 +272,9 @@
"edt_conf_bb_unknownFrameCnt_title": "image inconnu",
"edt_conf_bge_heading_title": "Effet/Couleur d'arrière-plan",
"edt_conf_bobls_heading_title": "Serveur Boblight",
"edt_conf_cec_event_title": "Évenement CEC",
"edt_conf_color_accuracyLevel_expl": "Niveau de précision de l'évaluation des couleurs dominantes. Un niveau plus élevé permet d'obtenir des résultats plus précis, mais nécessite également une plus grande puissance de traitement. Doit être combiné avec un traitement réduit des pixels.",
"edt_conf_color_accuracyLevel_title": "Niveau d'exactitude",
"edt_conf_color_backlightColored_expl": "Ajouter des couleurs à votre rétroéclairage",
"edt_conf_color_backlightColored_title": "Rétroéclairage coloré",
"edt_conf_color_backlightThreshold_expl": "La quantité minium de luminosité (rétroéclairage). Désactivé lors des effets, couleurs et sur le statut \"OFF\"",
@ -221,6 +285,7 @@
"edt_conf_color_blue_title": "Bleu",
"edt_conf_color_brightnessComp_expl": "Compense les différences de luminosité entre rouge vert bleu, cyan magenta jaune et blanc. 100 signifie compensation maximale, 0 pour aucune compensation.",
"edt_conf_color_brightnessComp_title": "Compensation de luminosité",
"edt_conf_color_brightnessGain_expl": "Règle la luminosité des couleurs. 1.0 signifie qu'il n'y a pas de changement, plus de 1.0 augmente la luminosité, moins de 1.0 diminue la luminosité.",
"edt_conf_color_brightnessGain_title": "Gain de luminosité",
"edt_conf_color_brightness_expl": "Paramétrer la luminosité générale des leds.",
"edt_conf_color_brightness_title": "Luminosité",
@ -248,7 +313,10 @@
"edt_conf_color_magenta_title": "Magenta",
"edt_conf_color_red_expl": "La valeur rouge calibrée.",
"edt_conf_color_red_title": "Rouge",
"edt_conf_color_reducedPixelSetFactorFactor_expl": "Évaluer uniquement un ensemble de pixels par zone LED définie, Faible ~25%, Moyen ~10%, Élevé ~6%",
"edt_conf_color_reducedPixelSetFactorFactor_title": "Réduction du traitement des pixels",
"edt_conf_color_saturationGain_expl": "Ajuste la saturation des couleurs. 1.0 signifie aucune changement, au dessus de 1.0 augmente la saturation, en dessous de 1.0 la diminue.",
"edt_conf_color_saturationGain_title": "Gain de Saturation",
"edt_conf_color_white_expl": "La valeur blanche calibrée.",
"edt_conf_color_white_title": "Blanc",
"edt_conf_color_yellow_expl": "La valeur jaune calibrée.",
@ -267,44 +335,71 @@
"edt_conf_enum_PAL": "PAL",
"edt_conf_enum_SECAM": "SECAM",
"edt_conf_enum_VERTICAL": "Verticale",
"edt_conf_enum_action_idle": "Inactif",
"edt_conf_enum_action_restart": "Redémarrer",
"edt_conf_enum_action_resume": "Continuer",
"edt_conf_enum_action_suspend": "Suspendre",
"edt_conf_enum_automatic": "Automatique",
"edt_conf_enum_bbclassic": "Classique",
"edt_conf_enum_bbdefault": "Defaut",
"edt_conf_enum_bbletterbox": "Boîte aux lettres",
"edt_conf_enum_bbosd": "OSD",
"edt_conf_enum_bgr": "BGR",
"edt_conf_enum_bottom_up": "De bas en haut",
"edt_conf_enum_brg": "BRG",
"edt_conf_enum_cec_key_f1_blue": "Bouton bleu enfoncé",
"edt_conf_enum_cec_key_f2_red": "Bouton rouge enfoncé",
"edt_conf_enum_color": "Couleur",
"edt_conf_enum_custom": "Personnalisation",
"edt_conf_enum_decay": "Décroissance",
"edt_conf_enum_delay": "Délai seulement",
"edt_conf_enum_disabled": "Désactivé",
"edt_conf_enum_dl_error": "Erreur",
"edt_conf_enum_dl_informational": "Informationnel",
"edt_conf_enum_dl_nodebug": "Pas de Debug",
"edt_conf_enum_dl_statechange": "Changement d'état",
"edt_conf_enum_dl_verbose": "Verbeux",
"edt_conf_enum_dl_verbose1": "Niveau de verbosité 1",
"edt_conf_enum_dl_verbose2": "Niveau de verbosité 2",
"edt_conf_enum_dl_verbose3": "Niveau de verbosité 3",
"edt_conf_enum_dominant_color": "Couleur dominante - par LED",
"edt_conf_enum_dominant_color_advanced": "Couleur dominante avancée - par LED",
"edt_conf_enum_effect": "Effet",
"edt_conf_enum_gbr": "GBR",
"edt_conf_enum_grb": "GRB",
"edt_conf_enum_high": "Élevé",
"edt_conf_enum_hsv": "HSV",
"edt_conf_enum_left_right": "De la gauche vers la droite",
"edt_conf_enum_linear": "Linéaire",
"edt_conf_enum_logdebug": "Débug",
"edt_conf_enum_logsilent": "Silencieux",
"edt_conf_enum_logverbose": "Verbeux",
"edt_conf_enum_logwarn": "Avertissement",
"edt_conf_enum_low": "Bas",
"edt_conf_enum_medium": "Moyen",
"edt_conf_enum_multicolor_mean": "Multicolor",
"edt_conf_enum_multicolor_mean_squared": "Couleur moyenne au carré - par LED",
"edt_conf_enum_please_select": "Veuillez sélectionner",
"edt_conf_enum_rbg": "RBG",
"edt_conf_enum_rgb": "RGB",
"edt_conf_enum_right_left": "De la droite vers la gauche",
"edt_conf_enum_top_down": "De haut en bas",
"edt_conf_enum_transeffect_smooth": "Lisse",
"edt_conf_enum_transeffect_sudden": "Soudain",
"edt_conf_enum_udp_ddp": "DDP",
"edt_conf_enum_udp_raw": "RAW",
"edt_conf_enum_unicolor_mean": "Unicolore",
"edt_conf_fbs_heading_title": "Serveur Flatbuffers",
"edt_conf_fbs_timeout_expl": "Si aucune donnée n'est reçue dans la période de temps donnée, le composant sera désactivé.",
"edt_conf_fbs_timeout_title": "Temps écoulé",
"edt_conf_fg_display_expl": "Sélectionnez l'écran à capturer (dans le cas d'un multi-écran)",
"edt_conf_fg_display_title": "Écran",
"edt_conf_fg_frequency_Hz_expl": "La vitesse à laquelle les nouvelles images sont capturées, c'est-à-dire la fréquence d'échantillonnage. Remarque : la vidéo peut être lue à une fréquence d'image plus ou moins élevée.",
"edt_conf_fg_frequency_Hz_title": "Fréquence de capture",
"edt_conf_fg_heading_title": "Platform de capture",
"edt_conf_fg_height_expl": "Réduit l'image à la hauteur définie, une image brute nécessite une grande puissance de calcul.",
"edt_conf_fg_height_title": "Hauteur",
"edt_conf_fg_pixelDecimation_expl": "Réduire la taille de l'image (facteur) en fonction de la taille originale. Un facteur de 1 signifie qu'il n'y a pas de changement",
"edt_conf_fg_pixelDecimation_title": "Décimation de l'image",
"edt_conf_fg_type_expl": "Type de capture d'écran, 'auto' par défaut",
"edt_conf_fg_type_title": "Type",
@ -319,11 +414,18 @@
"edt_conf_fge_heading_title": "Effet/Couleur de démarrage",
"edt_conf_fge_type_expl": "Choisissez parmi une couleur ou un effet.",
"edt_conf_fge_type_title": "Type",
"edt_conf_fw_flat_expl": "Une cible flatbuffer par élément de configuration",
"edt_conf_fw_flat_itemtitle": "cible du flatbuffer",
"edt_conf_fw_flat_services_discovered_expl": "Découverte de serveurs Hyperion fournissant des services flatbuffer",
"edt_conf_fw_flat_services_discovered_title": "Découverte des cibles Flatbuffer",
"edt_conf_fw_flat_title": "Liste des cibles flatbuffer",
"edt_conf_fw_heading_title": "Transitaire",
"edt_conf_fw_json_expl": "Une cible json par ligne. Contient IP: PORT (ex : 127.0.0.1:19446)",
"edt_conf_fw_json_itemtitle": "Cible json",
"edt_conf_fw_json_services_discovered_expl": "Découverte de serveurs Hyperion fournissant des services JSON-API",
"edt_conf_fw_json_services_discovered_title": "Découverte de cibles JSON",
"edt_conf_fw_json_title": "Liste des clients json",
"edt_conf_fw_remote_service_discovered_none": "Aucun service à distance n'a été découvert",
"edt_conf_fw_service_name_expl": "Nom du fournisseur de service",
"edt_conf_fw_service_name_title": "Nom du service",
"edt_conf_gen_configVersion_title": "Version de configuration",
@ -340,35 +442,54 @@
"edt_conf_general_port_title": "Port",
"edt_conf_general_priority_expl": "Priorité de ce composant",
"edt_conf_general_priority_title": "Canal de priorité",
"edt_conf_grabber_discovered_expl": "Sélectionnez le périphérique de capture découvert",
"edt_conf_grabber_discovered_none": "Aucun périphérique de capture trouvé",
"edt_conf_grabber_discovered_title": "Périphérique trouvé",
"edt_conf_grabber_discovered_title_info": "Sélectionner votre périphérique de capture trouvé",
"edt_conf_grabber_discovery_inprogress": "Découverte en cours",
"edt_conf_instC_audioEnable_expl": "Active la capture audio pour cette instance matérielle LED",
"edt_conf_instC_audioEnable_title": "Active la capture audio",
"edt_conf_instC_screen_grabber_device_expl": "Le périphérique de capture d'écran utilisé.",
"edt_conf_instC_screen_grabber_device_title": "Périphérique de capture d'écran",
"edt_conf_instC_systemEnable_expl": "Active la capture d'écran pour cette configuration de LED",
"edt_conf_instC_systemEnable_title": "Activer la capture d'écran",
"edt_conf_instC_v4lEnable_expl": "Active la capture USB pour cette configuration de LED",
"edt_conf_instC_v4lEnable_title": "Activer la capture USB",
"edt_conf_instC_video_grabber_device_expl": "Le périphérique de capture vidéo utilisé",
"edt_conf_instC_video_grabber_device_title": "Périphérique de capture vidéo",
"edt_conf_instCapture_heading_title": "Appareils de capture",
"edt_conf_js_heading_title": "Serveur JSON",
"edt_conf_log_heading_title": "Connexion",
"edt_conf_log_level_expl": "Vous verrez plus ou moins d'information selon le niveau de log que vous avez défini.",
"edt_conf_log_level_title": "Niveau de log",
"edt_conf_net_apiAuth_expl": "Obliger toutes les applications qui utilisent l'API Hyperion à s'authentifier auprès d'Hyperion (exception : voir \"Authentification API locale\"). Sécurité plus élevée, car vous contrôlez l'accès et vous pouvez le révoquer à tout moment.",
"edt_conf_net_apiAuth_title": "Authentification de l'API",
"edt_conf_net_heading_title": "Réseau",
"edt_conf_net_internetAccessAPI_expl": "Autoriser l'accès à l'API/l'interface Web Hyperion via internet. Désactiver pour plus de sécurité.",
"edt_conf_net_internetAccessAPI_title": "Accès internet API",
"edt_conf_net_ipWhitelist_expl": "Vous pouvez mettre les IP en liste blanche au lieu d'autoriser toutes les connexions depuis internet à l'API/interface web",
"edt_conf_net_ipWhitelist_title": "Liste blanche d'adresses IP",
"edt_conf_net_ip_itemtitle": "IP",
"edt_conf_net_localAdminAuth_expl": "Lorsque cette option est activée, l'accès à l'administration depuis le réseau local nécessite un mot de passe.",
"edt_conf_net_localAdminAuth_title": "Authentification API de l'administrateur local",
"edt_conf_net_localApiAuth_expl": "Lorsque cette option est activée, les connexions de votre réseau local doivent s'authentifier auprès d'Hyperion à l'aide d'un token.",
"edt_conf_net_localApiAuth_title": "Authentification de l'API locale",
"edt_conf_net_restirctedInternetAccessAPI_expl": "Vous pouvez limiter l'accès à l'API via l'internet à certaines IP.",
"edt_conf_net_restirctedInternetAccessAPI_title": "Limité aux IP",
"edt_conf_os_events_suspendEnable_expl": "Écoute les événements de suspension/reprise du système d'exploitation",
"edt_conf_os_events_suspendOnLockEnable_title": "Suspendre lorsqu'il est verrouillé",
"edt_conf_pbs_heading_title": "Serveur Protocol Buffers",
"edt_conf_pbs_timeout_expl": "Si aucune donnée n'est reçue dans la période de temps donnée, le composant sera désactivé.",
"edt_conf_pbs_timeout_title": "Temps écoulé",
"edt_conf_smooth_continuousOutput_expl": "Mettez à jour les leds mais si l'image n'a pas changé.",
"edt_conf_smooth_continuousOutput_title": "Sortie continue",
"edt_conf_smooth_decay_expl": "La vitesse de décroissance. La valeur 1 est linéaire, les valeurs supérieures ont un effet plus important.",
"edt_conf_smooth_decay_title": "Décroissance de puissance",
"edt_conf_smooth_dithering_expl": "Améliorez la précision des couleurs à des vitesses de production élevées en alternant les couleurs adjacentes.",
"edt_conf_smooth_dithering_title": "Dithering",
"edt_conf_smooth_heading_title": "Lissage",
"edt_conf_smooth_interpolationRate_expl": "Vitesse de calcul des cadres intermédiaires lisses.",
"edt_conf_smooth_interpolationRate_title": "Fréquence d'interpolation",
"edt_conf_smooth_time_ms_expl": "Combien de temps le lissage doit-il récupérer des images ?",
"edt_conf_smooth_time_ms_title": "Temps",
"edt_conf_smooth_type_expl": "Type de lissage.",
@ -377,21 +498,28 @@
"edt_conf_smooth_updateDelay_title": "Changer le retard",
"edt_conf_smooth_updateFrequency_expl": "Le vitesse de sortie pour le contrôleur led.",
"edt_conf_smooth_updateFrequency_title": "Charger la fréquence",
"edt_conf_time_event_title": "Temps",
"edt_conf_v4l2_blueSignalThreshold_expl": "Assombrie les valeurs bleues faibles (reconnues comme noires)",
"edt_conf_v4l2_blueSignalThreshold_title": "Seuil de signal bleu",
"edt_conf_v4l2_cecDetection_expl": "Si cette option est activée, la capture USB sera temporairement désactivée lorsque l'événement CEC standby sera reçu du bus HDMI.",
"edt_conf_v4l2_cecDetection_title": "détection CEC",
"edt_conf_v4l2_cropBottom_expl": "Le nombre de pixel sur le bas qui sont retirés de l'image.",
"edt_conf_v4l2_cropBottom_title": "Rognagne bas",
"edt_conf_v4l2_cropHeightValidation_error": "Le recadrage en haut + le recadrage en bas ne peut pas être supérieur à la hauteur (1$)",
"edt_conf_v4l2_cropLeft_expl": "Le nombre de pixels sur le côté gauche qui sont retirés de l'image.",
"edt_conf_v4l2_cropLeft_title": "Rognage gauche",
"edt_conf_v4l2_cropRight_expl": "Le nombre de pixels sur le côté droit qui sont retirés de l'image.",
"edt_conf_v4l2_cropRight_title": "Rognage droit",
"edt_conf_v4l2_cropTop_expl": "Le nombre de pixels sur le haut qui sont retirés de l'image.",
"edt_conf_v4l2_cropTop_title": "Rognage haut",
"edt_conf_v4l2_cropWidthValidation_error": "Le recadrage à gauche + le recadrage à droite ne peut pas être supérieur à la largeur ($1)",
"edt_conf_v4l2_device_expl": "Le chemin d'accès à l'interface de capture d'image USB. Mettre en 'Automatique' pour la détection automatique. Exemple : '/dev/video0'",
"edt_conf_v4l2_device_title": "Appareil",
"edt_conf_v4l2_encoding_expl": "Forcer l'encodage vidéo pour les cartes d'acquisition multiformat",
"edt_conf_v4l2_encoding_title": "Format d'encodage",
"edt_conf_v4l2_flip_expl": "Cela permet de retourner l'image horizontalement, verticalement ou les deux.",
"edt_conf_v4l2_flip_title": "Retourner Image",
"edt_conf_v4l2_fpsSoftwareDecimation_expl": "Pour économiser des ressources, chaque nième image sera traitée uniquement. Par exemple, si le grabber est réglé sur 30fps et que cette option est réglée sur 5, le résultat final sera d'environ 6fps.",
"edt_conf_v4l2_fpsSoftwareDecimation_title": "Saut d'images logiciel",
"edt_conf_v4l2_framerate_expl": "Nombre d'images par secondes supporté par le périphérique actif",
"edt_conf_v4l2_framerate_title": "Images par seconde",
@ -405,8 +533,13 @@
"edt_conf_v4l2_hardware_hue_title": "Contrôle matériel de la teinte",
"edt_conf_v4l2_hardware_saturation_expl": "Définie la saturation matérielle",
"edt_conf_v4l2_hardware_saturation_title": "Contrôle la saturation matériel",
"edt_conf_v4l2_hardware_set_defaults": "Contrôles matériels par défaut",
"edt_conf_v4l2_hardware_set_defaults_tip": "Définir les valeurs par défaut de l'appareil pour la luminosité, le contraste, la teinte et la saturation",
"edt_conf_v4l2_heading_title": "Capture USB",
"edt_conf_v4l2_input_expl": "Sélectionnez l'entrée vidéo de votre appareil. \"Automatique\" conserve la valeur choisie par l'interface v4l2.",
"edt_conf_v4l2_input_title": "Entrée",
"edt_conf_v4l2_noSignalCounterThreshold_expl": "Nombre d'images (à vérifier avec le mode FPS actuel de la carte d'acquisition) après lesquelles le signal \"no\" est déclenché.",
"edt_conf_v4l2_noSignalCounterThreshold_title": "Seuil du compteur de signaux",
"edt_conf_v4l2_redSignalThreshold_expl": "Assombrie les valeurs rouges faibles (reconnues comme noires)",
"edt_conf_v4l2_redSignalThreshold_title": "Seuil de signal rouge",
"edt_conf_v4l2_resolution_expl": "Liste des résolutions supportées pour le périphérique actif",
@ -434,9 +567,11 @@
"edt_conf_webc_keyPassPhrase_title": "Mot de passe de clé",
"edt_conf_webc_keyPath_expl": "Chemin vers la clé (doit être au format PEM, chiffrée avec RSA)",
"edt_conf_webc_keyPath_title": "Chemin de clé privée",
"edt_conf_webc_port_title": "Port HTTP",
"edt_conf_webc_sslport_expl": "Port HTTPS du serveur web",
"edt_conf_webc_sslport_title": "Port HTTPS",
"edt_dev_auth_key_title": "Token d'authentification",
"edt_dev_auth_key_title": "Jeton Autorisation",
"edt_dev_auth_key_title_info": "Jeton d'autorisation requis pour avoir accès au matériel",
"edt_dev_enum_sub_min_cool_adjust": "Soustraire le blanc froid",
"edt_dev_enum_sub_min_warm_adjust": "Soustraire le blanc chaud",
"edt_dev_enum_subtract_minimum": "Soustraire le minimum",
@ -444,6 +579,7 @@
"edt_dev_general_autostart_title": "Démarrage automatique",
"edt_dev_general_autostart_title_info": "Allumage du périphérique LED durant le démarrage ou non",
"edt_dev_general_colorOrder_title": "Ordre des octets RGB",
"edt_dev_general_colorOrder_title_info": "L'ordre des couleurs de l'appareil",
"edt_dev_general_enableAttemptsInterval_title": "Intervalle de relance",
"edt_dev_general_enableAttemptsInterval_title_info": "Intervalle entre deux tentatives de connexions.",
"edt_dev_general_enableAttempts_title": "Tentatives de connexion",
@ -458,13 +594,18 @@
"edt_dev_spec_FCsetConfig_title": "Paramétrer fadecandy",
"edt_dev_spec_LBap102Mode_title": "LightBerry APA102 Mode",
"edt_dev_spec_PBFiFo_title": "Pi-Blaster FiFo",
"edt_dev_spec_ada_mode_title": "Adalight - Standard",
"edt_dev_spec_awa_mode_title": "HyperSerial - Haut débit",
"edt_dev_spec_baudrate_title": "Vitesse de transmission",
"edt_dev_spec_blackLightsTimeout_title": "Délai de détection du signal en cas de noir",
"edt_dev_spec_brightnessFactor_title": "Facteur de luminosité",
"edt_dev_spec_brightnessMax_title": "Luminosité maximale",
"edt_dev_spec_brightnessMin_title": "Luminosité minimale",
"edt_dev_spec_brightnessOverwrite_title": "Ecraser luminosité",
"edt_dev_spec_brightnessThreshold_title": "Luminosité minimale de la détection du signal",
"edt_dev_spec_brightness_title": "Luminosité",
"edt_dev_spec_candyGamma_title": "Mode 'bougie' (double correction gamma)",
"edt_dev_spec_chanperfixture_title": "Canaux par appareil",
"edt_dev_spec_cid_title": "CID",
"edt_dev_spec_clientKey_title": "Clé client",
"edt_dev_spec_colorComponent_title": "Composant de coulour",
@ -472,18 +613,24 @@
"edt_dev_spec_delayAfterConnect_title": "Retard après connexion",
"edt_dev_spec_devices_discovered_none": "Aucun périphérique trouvé",
"edt_dev_spec_devices_discovered_title": "Périphériques trouvés",
"edt_dev_spec_devices_discovered_title_info": "Sélectionnez votre LED - appareil découvert",
"edt_dev_spec_devices_discovered_title_info_custom": "Sélectionnez votre LED - appareil découvert ou configurez-en un",
"edt_dev_spec_devices_discovery_inprogress": "Recherche",
"edt_dev_spec_dithering_title": "Distribution",
"edt_dev_spec_dmaNumber_title": "Canal DMA",
"edt_dev_spec_gamma_title": "Gamma",
"edt_dev_spec_globalBrightnessControlMaxLevel_title": "Courant maximum",
"edt_dev_spec_globalBrightnessControlThreshold_title": "Seuil de courant adaptatif",
"edt_dev_spec_gpioBcm_title": "Pin GPIO",
"edt_dev_spec_gpioMap_title": "Correspondance GPIO",
"edt_dev_spec_gpioNumber_title": "Numéro GPIO",
"edt_dev_spec_groupId_title": "ID de groupe",
"edt_dev_spec_groupId_title": "Groupe",
"edt_dev_spec_header_title": "Configuration spécifique",
"edt_dev_spec_interpolation_title": "Interpolation",
"edt_dev_spec_intervall_title": "Interval",
"edt_dev_spec_invert_title": "Inverser le signal",
"edt_dev_spec_latchtime_title": "Temps de verrouillage",
"edt_dev_spec_latchtime_title_info": "Le temps de latence est le délai nécessaire à un appareil pour traiter la prochaine mise à jour. Pendant ce délai, toutes les mises à jour effectuées sont ignorées.",
"edt_dev_spec_ledIndex_title": "Index de led",
"edt_dev_spec_ledType_title": "Type de LED",
"edt_dev_spec_lightid_itemtitle": "ID",
@ -494,29 +641,56 @@
"edt_dev_spec_maxPacket_title": "Paquet max.",
"edt_dev_spec_maximumLedCount_title": "Nombre max. de LED",
"edt_dev_spec_multicastGroup_title": "Group de multi-diffusion",
"edt_dev_spec_networkDeviceName_title": "Nom de l'appareil réseau",
"edt_dev_spec_networkDevicePort_title": "Port",
"edt_dev_spec_numberOfLeds_title": "Nombre de LED",
"edt_dev_spec_onBlackTimeToPowerOff": "Temps d'extinction de la lampe si le niveau de noir est déclenché",
"edt_dev_spec_onBlackTimeToPowerOn": "Temps d'allumage de la lampe si le signal est rétabli",
"edt_dev_spec_orbIds_title": "ID(s) Orb",
"edt_dev_spec_order_left_right_title": "2.",
"edt_dev_spec_order_top_down_title": "1.",
"edt_dev_spec_outputPath_title": "Chemin de sortie",
"edt_dev_spec_panel_start_position": "Panneau de départ [0-max panels]",
"edt_dev_spec_panelorganisation_title": "Panneau de séquence de numérotation",
"edt_dev_spec_pid_title": "PID",
"edt_dev_spec_port_expl": "Port de service [1-65535]",
"edt_dev_spec_port_title": "Port",
"edt_dev_spec_printTimeStamp_title": "Ajouter un horodatage",
"edt_dev_spec_pwmChannel_title": "Canal PWM",
"edt_dev_spec_razer_device_title": "Appareil Razer Chroma",
"edt_dev_spec_restoreOriginalState_title": "Restaurer l'état des lumières",
"edt_dev_spec_restoreOriginalState_title_info": "Rétablir l'état d'origine de l'appareil lorsqu'il est désactivé",
"edt_dev_spec_rgbw_calibration_blue": "Rapport du canal bleu/blanc",
"edt_dev_spec_rgbw_calibration_enable": "Calibrage du canal blanc (RGBW uniquement)",
"edt_dev_spec_rgbw_calibration_green": "Rapport du canal vert/blanc",
"edt_dev_spec_rgbw_calibration_limit": "Limite du canal blanc",
"edt_dev_spec_rgbw_calibration_red": "Rapport du canal rouge/blanc",
"edt_dev_spec_segmentId_title": "Identifiant du segment",
"edt_dev_spec_segmentsOverlapValidation_error": "Corrigez la configuration du WLED ! Le segment ne doit pas chevaucher {{plural:$1| segment|segments}} : \"$2\".",
"edt_dev_spec_segmentsSwitchOffOthers_title": "Désactiver d'autres segments",
"edt_dev_spec_segments_disabled_title": "Streaming de segment désactivé à WLED.",
"edt_dev_spec_segments_title": "Stream au segment",
"edt_dev_spec_serial_title": "Numéro de série",
"edt_dev_spec_spipath_title": "Chemin SPI",
"edt_dev_spec_sslHSTimeoutMax_title": "Délai d'attente maximum pour le handshake du streamer",
"edt_dev_spec_sslHSTimeoutMin_title": "Délai d'attente minimum pour le handshake du streamer",
"edt_dev_spec_stayOnAfterStreaming_title": "Rester allumé après la diffusion",
"edt_dev_spec_stayOnAfterStreaming_title_info": "L'appareil restera allumé après la diffusion ou le rétablissement de l'état.",
"edt_dev_spec_stream_protocol_title": "Protocole de diffusion",
"edt_dev_spec_switchOffOnBlack_title": "Éteindre avec le noir",
"edt_dev_spec_switchOffOnbelowMinBrightness_title": "Coupure, en dessous du minimum",
"edt_dev_spec_syncOverwrite_title": "Désactiver la synchronisation",
"edt_dev_spec_targetIpHost_expl": "Nom d'hôte (DNS/mDNS) ou adresse IP (IPv4 ou IPv6)",
"edt_dev_spec_targetIpHost_title": "IP/nom d'hôte cible",
"edt_dev_spec_targetIpHost_title_info": "Nom d'hôte ou adresse IP de l'appareil",
"edt_dev_spec_targetIp_title": "IP cible",
"edt_dev_spec_transeffect_title": "Effet de transition",
"edt_dev_spec_transistionTimeExtra_title": "Temps supplémentaire d'obscurité",
"edt_dev_spec_transistionTime_title": "Temps de transition",
"edt_dev_spec_uid_title": "UID",
"edt_dev_spec_universe_title": "Univers",
"edt_dev_spec_useAPIv2_title": "Utliser API v2",
"edt_dev_spec_useEntertainmentAPI_title": "Utiliser l'API Hue Entertainment",
"edt_dev_spec_useOrbSmoothing_title": "Utiliser le lissage orb",
"edt_dev_spec_useRgbwProtocol_title": "Utiliser le protocole RGBW",
"edt_dev_spec_username_title": "Nom d'utilisateur",
@ -536,6 +710,8 @@
"edt_eff_candle_header_desc": "Bougies chatoyantes",
"edt_eff_centerx": "Coordonnée X du centre",
"edt_eff_centery": "Coordonnée Y du centre",
"edt_eff_collision_header": "collision de couleurs",
"edt_eff_collision_header_desc": "Des projectiles de deux couleurs sont envoyés depuis des positions aléatoires et entrent en collision l'un avec l'autre.",
"edt_eff_color": "Couleur",
"edt_eff_colorHour": "Couleur des heures",
"edt_eff_colorMarker": "Couleur de marqueur",
@ -554,9 +730,11 @@
"edt_eff_countries": "Pays",
"edt_eff_customColor": "Couleur personnalisée",
"edt_eff_enableSecondSwirl": "Deuxième tourbillon",
"edt_eff_enableshutdown": "Éteignage réel",
"edt_eff_enum_all": "Tous",
"edt_eff_enum_all-together": "Tous ensemble",
"edt_eff_enum_list": "Liste des LED",
"edt_eff_explodeRadius": "Distance de détonation ",
"edt_eff_fade_header": "Fondu",
"edt_eff_fade_header_desc": "Fondu de couleurs",
"edt_eff_fadefactor": "Multiplicateur du fondu",
@ -575,14 +753,17 @@
"edt_eff_image_source": "Image source",
"edt_eff_image_source_file": "Fichier local",
"edt_eff_image_source_url": "URL",
"edt_eff_initial_blink": "Flash pour attirer l'attention",
"edt_eff_interval": "Intervalle",
"edt_eff_knightrider_header": "Chevalier",
"edt_eff_knightrider_header_desc": "K.I.T.T est de retour ! Le scanner avant de la voiture, cette fois pas seulement en rouge.",
"edt_eff_ledlist": "Liste de LED",
"edt_eff_ledtest_header": "Test LED",
"edt_eff_ledtest_header_desc": "sortie tournante: rouge, verte, blanche, noire",
"edt_eff_ledtest_seq_header": "Séquence d'essais LED",
"edt_eff_length": "Longueur",
"edt_eff_lightclock_header": "Horloge lumineuse",
"edt_eff_lightclock_header_desc": "Une véritable horloge lumineuse ! Ajustez les couleurs des heures, des minutes et des secondes. Un marqueur 3/6/9/12 heures est également disponible. Si l'horloge est erronée, vous devez vérifier l'horloge de votre système.",
"edt_eff_maintain_end_color": "Garder la couleur de fin",
"edt_eff_margin": "Marge",
"edt_eff_markerDepth": "Profondeur de marqueur",
@ -610,6 +791,7 @@
"edt_eff_reversedirection": "Direction inverse",
"edt_eff_rotationtime": "Temps de rotation",
"edt_eff_saturation": "Saturation",
"edt_eff_set_post_color": "Définir la couleur de l'affichage après alarme",
"edt_eff_showseconds": "Afficher les secondes",
"edt_eff_sleeptime": "Temps de sommeil",
"edt_eff_smooth_custom": "Activer le lissage",
@ -653,6 +835,10 @@
"edt_msg_error_disallow": "La valeur ne doit pas être du type : $1",
"edt_msg_error_disallow_union": "La valeur ne doit pas faire partie des types non permis spécifiés",
"edt_msg_error_enum": "La valeur doit faire partie des valeurs indiquées",
"edt_msg_error_hostname": "Le nom d'hôte n'a pas le bon format",
"edt_msg_error_invalid_epoch": "La date doit être postérieure au 1er janvier 1970",
"edt_msg_error_ipv4": "La valeur doit être une adresse IPv4 valide sous la forme de 4 nombres entre 0 et 255, séparés par des points",
"edt_msg_error_ipv6": "La valeur doit être une adresse IPv6 valide",
"edt_msg_error_maxItems": "La valeur doit avoir au plus $1 éléments",
"edt_msg_error_maxLength": "La valeur doit être au plus $1 caractères de long",
"edt_msg_error_maxProperties": "L'objet doit avoir au plus $1 propriétés",
@ -673,6 +859,8 @@
"edt_msg_error_type": "La valeur doit être du type : $1",
"edt_msg_error_type_union": "La valeur doit faire partie des types fournis",
"edt_msg_error_uniqueItems": "Le tableau doit avoir des éléments uniques",
"edt_msgcust_error_hostname_ip": "Nom d'hôte non valide, ni IPv4, ni IPv6",
"edt_msgcust_error_hostname_ip4": "Nom d'hôte ou IPv4 non valide",
"effectsconfigurator_button_conttest": "Test continu",
"effectsconfigurator_button_deleffect": "Supprimer un effet",
"effectsconfigurator_button_editeffect": "Charger un effet",
@ -694,9 +882,10 @@
"general_btn_grantAccess": "Donner l'accès",
"general_btn_iswitch": "Basculer",
"general_btn_next": "Suivant",
"general_btn_off": "Off",
"general_btn_off": "Désactivation",
"general_btn_ok": "OK",
"general_btn_on": "On",
"general_btn_on": "Activation",
"general_btn_overwrite": "Remplacer",
"general_btn_rename": "Renommer",
"general_btn_restarthyperion": "Redémarrer Hyperion",
"general_btn_save": "Sauvegarder",
@ -710,10 +899,11 @@
"general_col_blue": "bleu",
"general_col_green": "vert",
"general_col_red": "rouge",
"general_comp_AUDIO": "Capture de son",
"general_comp_BLACKBORDER": "Détection des bandes noires",
"general_comp_BOBLIGHTSERVER": "Serveur Boblight",
"general_comp_FLATBUFSERVER": "Serveur Flatbuffers",
"general_comp_FORWARDER": "Transfert",
"general_comp_FORWARDER": "Transition",
"general_comp_GRABBER": "Capture d'écran",
"general_comp_LEDDEVICE": "Périphérique LED",
"general_comp_PROTOSERVER": "Serveur Protocol Buffers",
@ -730,12 +920,15 @@
"general_country_us": "États-Unis",
"general_disabled": "désactivé",
"general_enabled": "activé",
"general_speech_ca": "Catalan",
"general_speech_cs": "Tchèque",
"general_speech_da": "Danois",
"general_speech_de": "Allemand",
"general_speech_el": "Grec",
"general_speech_en": "Anglais",
"general_speech_es": "Espagnol",
"general_speech_fr": "Français",
"general_speech_he": "Hébreu",
"general_speech_hu": "Hongrois",
"general_speech_it": "Italien",
"general_speech_ja": "Japonais",
@ -746,6 +939,7 @@
"general_speech_ro": "Roumain",
"general_speech_ru": "Russe",
"general_speech_sv": "Suédois",
"general_speech_tr": "Turque",
"general_speech_vi": "Vietnamien",
"general_speech_zh-CN": "Chinois (simplifié)",
"general_webui_title": "Hyperion - Configuration web",
@ -784,6 +978,7 @@
"main_ledsim_btn_togglelednumber": "Nombre de LED",
"main_ledsim_btn_toggleleds": "Montrer les LED",
"main_ledsim_btn_togglelivevideo": "Vidéo temps réel",
"main_ledsim_btn_togglesigdetect": "Zone de détection du signal",
"main_ledsim_text": "Visualisation en temps réel des couleurs des LED et optionnellement, le flux vidéo actuel issu du périphérique de capture",
"main_ledsim_title": "Visualisation LED",
"main_menu_about_token": "À propos d'Hyperion",
@ -792,6 +987,8 @@
"main_menu_dashboard_token": "Tableau de bord",
"main_menu_effect_conf_token": "Effets",
"main_menu_effectsconfigurator_token": "Configurateur d'effets",
"main_menu_event_services_token": "Services Évènements",
"main_menu_events": "Services Évènements",
"main_menu_general_conf_token": "Général",
"main_menu_grabber_conf_token": "Capture matérielle",
"main_menu_input_selection_token": "Sélection de l'entrée",
@ -829,9 +1026,13 @@
"remote_losthint": "Note : Toutes les modifications seront perdues après redémarrage.",
"remote_maptype_intro": "Habituellement, la disposition des LED définit quelle LED est en charge d'une partie de l'image. Vous pouvez la modifier ici : $1.",
"remote_maptype_label": "Type de correspondance",
"remote_maptype_label_dominant_color": "Couleur dominante",
"remote_maptype_label_dominant_color_advanced": "Couleur dominante avancée",
"remote_maptype_label_multicolor_mean": "Multicolore",
"remote_maptype_label_multicolor_mean_squared": "Couleur moyenne au carré",
"remote_maptype_label_unicolor_mean": "Unicolore",
"remote_optgroup_syseffets": "Effets fournis",
"remote_optgroup_templates_custom": "Modèles d'utilisateurs",
"remote_optgroup_templates_system": "Modèles Système",
"remote_optgroup_usreffets": "Effets utilisateur",
"remote_videoMode_2D": "2D",
@ -869,8 +1070,12 @@
"update_label_type": "Type :",
"update_no_updates_for_branch": "Pas de mise à jour pour le canal sélectionné.",
"update_versreminder": "Votre version : $1",
"wiz_atmoorb_desc2": "Choisissez maintenant les orbes à ajouter. La position assigne la lampe à une position spécifique sur votre \"image\". Les lampes désactivées ne seront pas ajoutées. Pour identifier les lampes individuelles, appuyez sur le bouton de droite.",
"wiz_atmoorb_intro1": "Cet assistant configure Hyperion pour les AtmoOrbs. Les fonctionnalités sont la détection automatique des AtmoOrbs, le réglage de chaque lumière à une position spécifique sur votre image ou sa désactivation et l'optimisation automatique des paramètres d'Hyperion ! En bref : il suffit de quelques clics et le tour est joué !",
"wiz_atmoorb_title": "Assisant AtmoOrb",
"wiz_cc_adjustgamma": "Gamma : Vous devez ici ajuster le niveau de gamma de chaque canal afin d'obtenir le même niveau. Conseil : Neutre est égal à 1.0 ! Par exemple, si votre Gris est un peu rougeâtre, cela signifie que vous devez augmenter le gamma du rouge pour réduire son effet (plus le gamma est élevé, plus la couleur sera absente).",
"wiz_cc_adjustit": "Ajuster votre \"$1\" jusqu'à obtenir l'effet désiré. Attention : plus vous vous éloignez des valeur par défaut, plus la plage de couleur sera limité (s'applique aux couleurs intermédiaires). Les résultats peuvent variés en fonction de votre TV/plage de couleur de vos LED.",
"wiz_cc_backlight": "De plus, vous pouvez définir un rétroéclairage pour éliminer les \"mauvaises couleurs\" dans les zones presque sombres ou si vous n'aimez pas le passage de la couleur à l'arrêt pendant le visionnage. Vous pouvez aussi définir s'il doit y avoir de la couleur ou simplement du blanc. Cette fonction est désactivée dans les états \"Eteint\", \"Couleur\" et \"Effet\".",
"wiz_cc_btn_stop": "Arrêter la vidéo",
"wiz_cc_btn_switchpic": "Changer d'image",
"wiz_cc_chooseid": "Donner un nom à ce profil de couleurs.",
@ -891,17 +1096,27 @@
"wiz_cc_testintrowok": "Consultez le lien suivant pour télécharger des vidéos de test : ",
"wiz_cc_title": "Assistant de calibration des couleurs",
"wiz_cc_try_connect": "Connexion en cours...",
"wiz_cololight_desc2": "Choisissez maintenant les Cololights à ajouter. Pour identifier les lumières individuelles, appuyez sur le bouton de droite.",
"wiz_cololight_intro1": "This wizards configures Hyperion for the Cololight system. Features are the Cololight auto detection and tune the Hyperion settings automatically! In short: All you need are some clicks and you are done!<br />Note: En cas de Strip Cololight, vous devrez peut-être corriger manuellement le nombre et la disposition des LED.",
"wiz_cololight_noprops": "Récupération des propriétés du périphérique impossible. Définissez manuellement le nombre de LED physiques",
"wiz_cololight_title": "Assistant Cololight",
"wiz_guideyou": "Le $1 vous guidera à travers les réglages. Cliquez sur le bouton !",
"wiz_hue_blinkblue": "Laissez ID $1 s'allumer en bleu",
"wiz_hue_blinkblue": "Laisse-le s'éclairer",
"wiz_hue_clientkey": "Clé Client :",
"wiz_hue_create_user": "Créer un nouvel utilisateur",
"wiz_hue_desc1": "Il recherche automatiquement un Hue Bridge, au cas où il n'en trouverait pas, vous devez fournir l'adresse IP et appuyer sur le bouton actualiser à droite. Maintenant, vous avez besoin d'un ID utilisateur, si vous n'en avez pas, créez-en un nouveau.",
"wiz_hue_desc2": "Choisissez maintenant les lampes à ajouter. La position attribue la lampe à une position spécifique sur votre \"image\". Les lampes désactivées ne seront pas ajoutées. Pour identifier des lampes individuelles, appuyez sur le bouton à droite.",
"wiz_hue_e_clientkey_needed": "Une clé client correspondant au nom d'utilisateur est nécessaire pour utiliser l'API de divertissement. Veuillez saisir une clé existante ou utiliser le bouton ci-dessous pour en créer une nouvelle.",
"wiz_hue_e_create_user": "Créer un nouvel utilisateur et clé cliente",
"wiz_hue_e_desc1": "1. Hyperion cherche automatiquement un Hue-Bridge, au cas où il n'en trouverait pas vous devez fournir le nom d'hôte ou l'adresse IP et appuyer sur le bouton de rechargement. <br> 2. Fournissez un nom d'utilisateur et une clé de client, si vous n'avez pas les deux, créez-en de nouveaux.",
"wiz_hue_e_desc2": "Choisissez votre groupe de divertissement, celui qui a toutes les lumières pour l'utiliser avec Hyperion",
"wiz_hue_e_desc3": "4. Choisissez la position dans laquelle la lampe concernée doit être \"dans l'image\". Une présélection de la position a été effectuée sur la base des positions configurées des lampes dans le groupe de divertissement. Il s'agit d'une simple recommandation qui peut être adaptée selon votre préférence. Vous pouvez donc les mettre brièvement en évidence en cliquant sur le bouton de droite afin d'améliorer la sélection.",
"wiz_hue_e_intro1": "Cet assistant configure Hyperion pour le célèbre système Philips Hue Entertainment. Les fonctionnalités sont les suivantes : Détection automatique du Hue Bridge, création de clés d'utilisateur et de client, sélection de groupes de divertissement, réglage des lumières d'un groupe à une position spécifique sur votre image et optimisation automatique des paramètres d'Hyperion ! En bref : il suffit de quelques clics et le tour est joué !",
"wiz_hue_e_noapisupport": "L'assistant a désactivé la prise en charge de l'API de divertissement et continuera en mode classique.",
"wiz_hue_e_noapisupport_hint": "L'option\"<b>Use Hue Entertainment API</b>\" a été décochée.",
"wiz_hue_e_noegrpids": "Aucun groupe de divertissement Hue défini",
"wiz_hue_e_nogrpids": "Ce pont Hue n'a aucun groupe défini, veuillez en créer au moins un au préalable avec l'application Hue",
"wiz_hue_e_title": "Assistant de divertissement Philips Hue",
"wiz_hue_e_use_group": "Utiliser Groupe",
"wiz_hue_e_use_groupid": "Utiliser groupe ID $1",
"wiz_hue_failure_connection": "Le délai a expiré : Appuyez sur le bouton du Bridge dans les 30 secondes.",
@ -916,8 +1131,12 @@
"wiz_hue_username": "ID utilisateur : ",
"wiz_identify": "Identifié",
"wiz_identify_light": "Identifié $1",
"wiz_identify_tip": "Identifier le dispositif configuré en l'allumant",
"wiz_ids_disabled": "Désactivé",
"wiz_ids_entire": "Image entière",
"wiz_layout": "Générer une mise en page",
"wiz_nanoleaf_press_onoff_button": "Veuillez appuyer sur le bouton Marche/Arrêt de votre appareil Nanoleaf pendant 5 à 7 secondes.",
"wiz_nanoleaf_user_auth_intro": "L'assistant vous aide à générer un jeton d'autorisation utilisateur requis pour permettre à Hyperion d'accéder à l'appareil.",
"wiz_noLights": "Pas de $1 trouvé! Veuillez connecter les lumières au réseau ou configurez les manuellement.",
"wiz_pos": "Position/État",
"wiz_rgb_expl": "Le point coloré change de couleur (rouge, vert) toutes les x secondes, en même temps que vos LEDs passent à cette couleur. Répondez aux questions en bas pour vérifier/corriger votre ordre d'octets.",
@ -929,5 +1148,8 @@
"wiz_rgb_switchevery": "Changer de couleur toutes les...",
"wiz_rgb_title": "Assistant de configuration d'ordre des octets RVB",
"wiz_wizavail": "Assistant de configuration disponible",
"wiz_yeelight_desc2": "Choisissez maintenant les lampes à ajouter. La position assigne la lampe à une position spécifique sur votre \"image\". Les lampes désactivées ne seront pas ajoutées. Pour identifier les lampes individuelles, appuyez sur le bouton de droite.",
"wiz_yeelight_intro1": "Cet assistant configure Hyperion pour le système Yeelight. Les fonctionnalités sont la détection automatique des Yeelight, le réglage de chaque lumière à une position spécifique sur votre image ou la désactivation et le réglage automatique des paramètres d'Hyperion ! En résumé : il suffit de quelques clics et le tour est joué !",
"wiz_yeelight_title": "Assistant Yeelight",
"wiz_yeelight_unsupported": "Non supporté"
}

View File

@ -0,0 +1,155 @@
{
"InfoDialog_access_text": "בהתאם לרמת ההגדרות תוכל להתאים אפשרויות נוספות או לקבל גישה לתכונות נוספות. רמת \"ברירת המחדל\" המומלצת היא.",
"InfoDialog_iswitch_text": "אם אתה מפעיל את Hyperion יותר מפעם אחת ברשת המקומית שלך, תוכל לעבור בין תצורות האינטרנט. בחר את המופע של Hyperion למטה והחלף!",
"InfoDialog_nostorage_text": "הדפדפן שלך אינו תומך ב-localStorage. לא ניתן לשמור הגדרת שפה מסוימת (חזרה ל'זיהוי אוטומטי') ורמת גישה (חזרה ל'ברירת מחדל'). קוסמים מסוימים עשויים להיות מוסתרים. אתה עדיין יכול להשתמש בממשק האינטרנט ללא בעיות נוספות",
"InfoDialog_nowrite_text": "Hyperion לא יכול לכתוב לקובץ התצורה הנטען הנוכחי שלך. אנא תקן את הרשאות הקובץ כדי להמשיך.",
"conf_colors_blackborder_intro": "דלג על פסים שחורים באשר הם. כל מצב משתמש באלגוריתם זיהוי אחר המכוון למצבים מיוחדים. תעלה את הסף אם זה לא עובד לך.",
"conf_colors_color_intro": "צור פרופיל כיול אחד או יותר, התאם כל צבע, בהירות, ליניאריזציה ועוד.",
"conf_colors_smoothing_intro": "החלקה משטחת שינויי צבע/בהירות כדי להפחית הסחת דעת מעצבנת.",
"conf_effect_bgeff_intro": "הגדר אפקט/צבע רקע, המוצג בזמן \"בטלה\" של Hyperion. מתחיל תמיד בערוץ עדיפות 255.",
"conf_effect_fgeff_intro": "הגדר אפקט אתחול או צבע, שיוצג במהלך האתחול של Hyperion למשך הזמן שהוגדר.",
"conf_effect_path_intro": "טען אפקטים מהנתיבים המוגדרים. בנוסף, אתה יכול להשבית אפקטים בודדים לפי שם כדי להסתיר אותם מכל רשימות האפקטים.",
"conf_general_impexp_expbtn": "ייצא",
"conf_general_impexp_impbtn": "ייבא",
"conf_general_impexp_l1": "ייבא הגדרה על ידי בחירת קובץ הגדרות למטה ולחץ על \"ייבוא\".",
"conf_general_impexp_l2": "ייצא הגדרה על ידי בחירת קובץ הגדרות למטה ולחץ על \"ייצוא\".",
"conf_general_impexp_title": "תצורת ייבוא/ייצוא",
"conf_general_intro": "הגדרות בסיסיות סביב Hyperion ו-WebUI שאינן מתאימות לקטגוריה אחרת.",
"conf_general_label_title": "הגדרות כלליות",
"conf_grabber_fg_intro": "לכידת מסך היא לכידת המערכת המקומית שלך כמקור קלט, Hyperion מותקן על.",
"conf_grabber_v4l_intro": "לכידת USB היא התקן (לכידה) המחובר באמצעות USB המשמש להזנת תמונות מקור לעיבוד.",
"conf_helptable_expl": "הֶסבֵּר",
"conf_helptable_option": "אפשרות",
"conf_leds_contr_label_contrtype": "סוג בקר",
"conf_leds_device_intro": "Hyperion תומך בהרבה בקרים להעברת נתונים למכשיר היעד שלך. בחר בקר LED מתוך הרשימה הממוינת והגדר אותו. בחרנו את הגדרות ברירת המחדל הטובות ביותר עבור כל מכשיר.",
"conf_leds_layout_btn_checklist": "הצג רשימת בדיקה",
"conf_leds_layout_checkp1": "ה-LED השחור הוא ה-LED הראשון שלך, LED הראשון הוא הנקודה שבה אתה מזין את אות הנתונים שלך.",
"conf_leds_layout_checkp2": "הפריסה היא תמיד המראה הקדמי של הטלוויזיה שלך, לעולם לא התצוגה האחורית.",
"conf_leds_layout_checkp3": "ודא שהכיוון נכון. הנוריות האפורות מציינות את מספר LED 2 ו-3 כדי להמחיש את כיוון הנתונים.",
"conf_leds_layout_checkp4": "בחר פער: בכדי ליצור פער, התעלם ממנו תחילה כאשר אתה מגדיר עליון/תחתון/שמאל/ימין והגדר לאחר מכן את אורך הפער כדי להסיר כמות לדים. שנה את מיקום הפער עד שיתאים.",
"conf_leds_layout_frame": "פריסה קלאסית (מסגרת LED)",
"conf_leds_layout_generatedconf": "תצורת LED שנוצרה/נוכחית",
"conf_leds_layout_intro": "אתה גם צריך פריסת LED, המשקפת את עמדות LED שלך. הפריסה הקלאסית היא מסגרת הטלוויזיה המשמשת בדרך כלל, אך אנו תומכים גם ביצירת מטריצות LED (קירות LED). התצוגה על פריסה זו היא תמיד מחזית הטלוויזיה שלך.",
"conf_leds_layout_matrix": "פריסת מטריצה (קיר LED)",
"conf_leds_layout_textf1": "שדה טקסט זה מציג כברירת מחדל את הפריסה הנטענת הנוכחית שלך וייחלף אם תיצור פריסה חדשה עם האפשרויות שלמעלה. לחלופין, תוכל לבצע עריכות נוספות.",
"conf_leds_nav_label_ledcontroller": "בקר LED",
"conf_leds_nav_label_ledlayout": "פריסת LED",
"conf_leds_optgroup_network": "רשת",
"conf_logging_label_intro": "אזור לבדיקת הודעות יומן, תראה יותר או פחות מידע בהתאם לרמת הרישום שנקבעה.",
"conf_network_forw_intro": "העבר את כל הקלט להתקנה שנייה של Hyperion שניתן להניע עם בקר LED אחר",
"conf_network_proto_intro": "ה-PROTO-Port של כל המופעים של Hyperion, המשמש עבור זרמי תמונות (HyperionScreenCap, Kodi Addon, Android Hyperion Grabber, ...)",
"dashboard_alert_message_confedit": "תצורת ה-Hyperion שלך שונתה. כדי להחיל אותו, הפעל מחדש את Hyperion.",
"dashboard_alert_message_confedit_t": "התצורה השתנתה",
"dashboard_alert_message_confsave_success": "תצורת ה-Hyperion שלך נשמרה בהצלחה. השינויים שלך פעילים כעת.",
"dashboard_alert_message_confsave_success_t": "התצורה נשמרה",
"dashboard_componentbox_label_comp": "רְכִיב",
"dashboard_componentbox_label_status": "מצב",
"dashboard_componentbox_label_title": "מצב הרכיבים",
"dashboard_infobox_label_currenthyp": "גרסת ה-Hyperion שלך:",
"dashboard_infobox_label_instance": "למשל:",
"dashboard_infobox_label_latesthyp": "הגרסה האחרונה של Hyperion:",
"dashboard_infobox_label_platform": "פלטפורמה:",
"dashboard_infobox_label_ports": "יציאות",
"dashboard_infobox_label_smartacc": "גישה חכמה",
"dashboard_infobox_label_statush": "מצב ה-Hyperion:",
"dashboard_infobox_label_title": "מידע",
"dashboard_infobox_message_updatesuccess": "הינך מריץ את הגרסה האחרונה של Hyperion.",
"dashboard_infobox_message_updatewarning": "גרסה חדשה יותר של Hyperion זמינה! ($1)",
"dashboard_label_intro": "לוח המחוונים נותן לך סקירה מהירה על מצב ה- Hyperion",
"dashboard_newsbox_label_title": "בלוג ה-Hyperion",
"dashboard_newsbox_noconn": "לא ניתן להתחבר לשרת Hyperion כדי לאחזר את הפוסטים האחרונים, האם חיבור האינטרנט שלך תקין?",
"dashboard_newsbox_readmore": "קרא עוד",
"dashboard_newsbox_visitblog": "בקר ב-Hyperion בלוג ",
"edt_conf_color_brightnessComp_expl": "מפצה על הבדלי בהירות בין אדום ירוק כחול, ציאן מגנטה צהוב ולבן. 100 פירושו פיצוי מלא, 0 אין פיצוי",
"edt_conf_color_channelAdjustment_header_expl": "צור פרופילי צבע שניתן להקצות לרכיב מסוים. התאם צבע, גמא, בהירות, פיצוי ועוד.",
"edt_conf_v4l2_fpsSoftwareDecimation_expl": "כדי לחסוך במשאבים כל מסגרת n' תעובד בלבד. למשל. אם ה-grabber מוגדר ל-30fps עם אפשרות זו מוגדרת ל-5, התוצאה הסופית תהיה בסביבות 6fps",
"edt_conf_v4l2_signalDetection_expl": "אם מופעל, לכידת USB תושבת זמנית כאשר לא נמצא אות. זה יקרה כאשר התמונה תרד מתחת לערך הסף למשך תקופה של 4 שניות.",
"effectsconfigurator_label_intro": "צור מתוך האפקטים הבסיסיים אפקטים חדשים המותאמים לטעמך. בהתאם לאפקט יש אפשרויות כמו צבע, מהירות, כיוון ועוד.",
"general_access_advanced": "מתקדם",
"general_access_default": "ברירת מחדל",
"general_access_expert": "מומחה",
"general_btn_back": "חזור",
"general_btn_cancel": "בטל",
"general_btn_continue": "המשך",
"general_btn_iswitch": "החלף",
"general_btn_next": "הבא",
"general_btn_off": "כיבוי",
"general_btn_ok": "בסדר",
"general_btn_on": "הדלקה",
"general_btn_restarthyperion": "הפעל מחדש את Hyperion",
"general_btn_save": "שמור",
"general_btn_saveandreload": "שמור וטען מחדש",
"general_btn_yes": "כן",
"general_button_savesettings": "שמור הגדרות",
"general_col_blue": "כחול",
"general_col_green": "ירוק",
"general_col_red": "אדום",
"general_comp_BLACKBORDER": "Blackbar זיהוי",
"general_comp_BOBLIGHTSERVER": "שרת Boblight",
"general_comp_FLATBUFSERVER": "שרת ",
"general_comp_FORWARDER": "שילוח",
"general_comp_GRABBER": "לכידת מסך",
"general_comp_LEDDEVICE": "פלט LED",
"general_comp_PROTOSERVER": "שרת מאגר פרוטוקול",
"general_comp_SMOOTHING": "חלק",
"general_comp_V4L": "לכידת כניסת USB",
"general_country_de": "גרמניה",
"general_country_es": "ספרד",
"general_country_fr": "צרפת",
"general_country_it": "איטליה",
"general_country_nl": "הולנד",
"general_country_uk": "בריטניה",
"general_country_us": "ארצות הברית",
"general_speech_cs": "צ'כית",
"general_speech_de": "גרמנית",
"general_speech_en": "אנגלית",
"general_speech_es": "ספרדית",
"general_speech_it": "איטלקית",
"general_webui_title": "Hyperion - תצורת אינטרנט",
"general_wiki_moreto": "מידע נוסף על \"$1\" בוויקי שלנו",
"info_restart_contus": "אם אתה עדיין משוטט כאן לאחר 20 שניות ואין לך מושג למה, בבקשה פתח נושא חדש בפורום התמיכה שלנו...",
"main_ledsim_btn_togglelednumber": "מספר נורות LED",
"main_ledsim_btn_toggleleds": "הצג אורות",
"main_ledsim_btn_togglelivevideo": "וידאו חי",
"main_ledsim_text": "הדמיה חיה של צבעי LED ואפשרות הזרמת הווידאו הנוכחי של מכשיר הלכידה שלך.",
"main_ledsim_title": "חזותיות LED",
"main_menu_about_token": "אודות Hyperion",
"main_menu_colors_conf_token": "עיבוד תמונה",
"main_menu_dashboard_token": "לוּחַ מַחווָנִים",
"main_menu_effect_conf_token": "אפקטים",
"main_menu_effectsconfigurator_token": "הגדרת אפקטים",
"main_menu_general_conf_token": "כללי",
"main_menu_grabber_conf_token": "לכידת חומרה",
"main_menu_input_selection_token": "בחירת קלט",
"main_menu_leds_conf_token": "יצאת LED",
"main_menu_network_conf_token": "שירותי אינטרנט",
"main_menu_remotecontrol_token": "שלט רחוק",
"main_menu_support_token": "תמיכה",
"main_menu_system_token": "מערכת",
"main_menu_update_token": "עדכון",
"main_menu_webconfig_token": "תצורת אינטרנט",
"remote_input_intro": "Hyperion משתמש במערכת עדיפות לבחירת מקור. לכל מה שתגדירו יש עדיפות (אפקט/צבע/צילום מסך/לכידת USB ומקורות רשת). כברירת מחדל, Hyperion בוחר מקורות בהתאם לעדיפות (המספר הנמוך ביותר משקף את המקור הפעיל הנוכחי). כעת יש לך הזדמנות לבחור מקורות בעצמך. $1",
"support_label_intro": "Hyperion היא תוכנה חינמית ללא מטרות רווח. צוות קטן עובד על זה וזו הסיבה שאנחנו צריכים את התמיכה הקבועה שלכם.",
"update_label_intro": "סקירה כללית על כל גרסאות Hyperion הזמינות. בנוסף, תוכל לעדכן או לשדרג לאחור את הגרסה שלך של Hyperion מתי שתרצה. ממוין מהחדש להכי ישן",
"wiz_atmoorb_desc2": "כעת בחר אילו כדורים יש להוסיף. המיקום מקצה את המנורה למיקום מסוים ב\"תמונה\" שלך. מנורות מושבתות לא יתווספו. לזיהוי מנורות בודדות לחץ על הכפתור בצד ימין.",
"wiz_atmoorb_intro1": "אשף זה מגדיר את Hyperion עבור AtmoOrbs. התכונות הן הזיהוי האוטומטי של AtmoOrb, הגדרת כל אור למיקום ספציפי בתמונה שלך או השבתה וביצוע אופטימיזציה של הגדרות Hyperion באופן אוטומטי! אז בקיצור: כל מה שאתה צריך זה כמה קליקים וסיימת!",
"wiz_cc_adjustgamma": "גמא: מה שאתה צריך לעשות הוא, להתאים את רמות הגמא של כל ערוץ עד שתהיה לך אותה כמות נתפסת של כל ערוץ. רמז: ניטרלי הוא 1.0! לדוגמה, אם האפור שלך קצת אדמדם, זה אומר שאתה צריך להגדיל את הגמא האדום כדי להפחית את כמות האדום (ככל שיותר גמא, כך פחות צבע).",
"wiz_cc_adjustit": "התאם את ה-\"$1\" שלך עד שתסתדר עם זה. שימו לב: ככל שתתרחקו מערך ברירת המחדל, ספקטרום הצבעים יהיה מוגבל (גם עבור כל הצבעים שביניהם). תלוי בקול הטלוויזיה/LED",
"wiz_cc_backlight": "בנוסף, אתה יכול להגדיר תאורה אחורית כדי למיין \"צבעים רעים\" באזורים כמעט כהים או אם אתה לא אוהב את המעבר בין צבע לכבוי במהלך הצפייה. בנוסף אתה יכול להגדיר אם צריך להיות בו קצת צבע או רק לבן. זה מושבת במצב \"כבוי\", \"צבע\" ו\"אפקט\".",
"wiz_cc_intro1": "אשף זה ידריך אותך בכיול ה-LED שלך. אם אתה משתמש בקודי, ניתן לשלוח את תמונות הכיול וסרטוני הווידאו ישירות אליו. תנאי מוקדם: עליך להפעיל את \"אפשר שליטה מרחוק מיישומים במערכות אחרות\" בקודי.<br />לחלופין, ייתכן שתרצה להוריד את הקבצים האלה בעצמך ולהציג אותם כשהאשף יבקש ממך להתאים את ההגדרה.",
"wiz_cc_kodidiscon": "Kodi לא נמצא, המשך ללא תמיכת Kodi (אנא בדוק אם שלט רחוק על ידי מערכות אחרות מופעלת).",
"wiz_cc_summary": "מסקנה של ההגדרות שלך. במהלך הפעלת וידאו, תוכל לשנות או לבדוק שוב ערכים. אם סיימת, לחץ על שמור.",
"wiz_cololight_intro1": "אשף זה מגדיר את Hyperion עבור מערכת Cololight. התכונות הן הזיהוי האוטומטי של Cololight וכוונון את הגדרות Hyperion באופן אוטומטי! בקיצור: כל מה שאתה צריך זה כמה קליקים וסיימת!<br />הערה: במקרה של Cololight Strip, ייתכן שיהיה עליך לתקן ידנית את ספירת ה-LED ואת הפריסה.",
"wiz_hue_desc1": "1. Hyperion מחפש אוטומטית עבור Hue-Bridge, במקרה שהוא לא יכול למצוא אחד, עליך לספק את שם המארח או כתובת ה-IP וללחוץ על כפתור הטעינה מחדש. \n2. ספק מזהה משתמש, אם אין לך צור אחד חדש.",
"wiz_hue_desc2": "3. כעת בחרו אילו מנורות יש להוסיף. המיקום מקצה את המנורה למיקום מסוים ב\"תמונה\" שלך. מנורות מושבתות לא יתווספו. לזיהוי מנורות בודדות לחץ על הכפתור בצד ימין",
"wiz_hue_e_desc1": "1. Hyperion מחפש אוטומטית עבור Hue-Bridge, במקרה שהוא לא יכול למצוא אחד, עליך לספק את שם המארח או כתובת ה-IP וללחוץ על כפתור הטעינה מחדש. <br>2. ספק מזהה משתמש ומפתח הלקוח, אם אין לך את שניהם, צור חדשים.",
"wiz_hue_e_desc3": "4. בחר באיזה מיקום המנורה המתאימה צריכה להיות \"בתמונה\". בחירה מראש של העמדה נעשתה בהתבסס על המיקומים המוגדרים של האורות בקבוצת הבידור. זו רק המלצה וניתן להתאים אישית לפי הרצון. לכן אתה יכול להדגיש אותם בקצרה על ידי לחיצה על הכפתור הימני כדי לשפר את הבחירה.",
"wiz_hue_e_intro1": "אשף זה מגדיר את Hyperion עבור מערכת Philips Hue Entertainment הידועה. התכונות הן: זיהוי אוטומטי של Hue Bridge, יצירת מפתחות משתמש ולקוח, בחירת קבוצת בידור, הגדרת אורות קבוצה למיקום ספציפי בתמונה שלך ואופטימיזציה של הגדרות Hyperion באופן אוטומטי! אז בקיצור: כל מה שאתה צריך זה כמה קליקים וסיימת!",
"wiz_hue_failure_user": "המשתמש לא נמצא, צור אחד חדש עם הכפתור למטה או הזן מזהה משתמש חוקי ולחץ על הסמל \"טען מחדש\".",
"wiz_hue_intro1": "אשף זה מגדיר את Hyperion עבור מערכת Philips Hue הידועה. התכונות הן זיהוי אוטומטי של Hue Bridge, יצירת משתמש, הגדר כל אור גוון למיקום מסוים בתמונה שלך או השבת אותו וכוונו את הגדרות Hyperion באופן אוטומטי! אז בקיצור: כל מה שאתה צריך זה כמה קליקים וסיימת!",
"wiz_rgb_expl": "נקודת הצבע מחליפה כל x שניות את הצבע (אדום, ירוק), ובאותו הזמן גם נוריות ה-LED שלך מחליפות את הצבע. ענה על השאלות בתחתית כדי לבדוק/לתקן את סדר הביטים שלך.",
"wiz_rgb_intro1": "אשף זה ידריך אותך בתהליך מציאת סדר הצבעים הנכון עבור הלדים שלך. לחץ על המשך כדי להתחיל.",
"wiz_rgb_intro2": "מתי אתה צריך את האשף הזה? דוגמה: אתה קובע את הצבע האדום, אבל אתה מקבל ירוק או כחול. אתה יכול גם להשתמש בו עבור תצורה ראשונה.",
"wiz_yeelight_desc2": "כעת בחר אילו מנורות יש להוסיף. המיקום מקצה את המנורה למיקום מסוים ב\"תמונה\" שלך. מנורות מושבתות לא יתווספו. לזיהוי מנורות בודדות לחץ על הכפתור בצד ימין.",
"wiz_yeelight_intro1": "אשף זה מגדיר את Hyperion עבור מערכת Yeelight. התכונות הן הזיהוי האוטומטי של Yeelighs, הגדרת כל אור למיקום מסוים בתמונה שלך או להשבית אותו ולכוון את הגדרות Hyperion באופן אוטומטי! אז בקיצור: כל מה שאתה צריך זה כמה קליקים וסיימת!"
}

View File

@ -229,6 +229,7 @@
"edt_append_pixel": "Pixel",
"edt_append_s": "s",
"edt_append_sdegree": "s/degree",
"edt_conf_audio_heading_title": "Hangrögzítés",
"edt_conf_bb_blurRemoveCnt_expl": "Azon képpontok száma, amelyeket eltávolítunk az észlelt szegélyről az elmosódottság megszüntetése érdekében.",
"edt_conf_bb_blurRemoveCnt_title": "Elmosódott pixel",
"edt_conf_bb_borderFrameCnt_expl": "A képkockák száma az érzékelt szegély beállítása előtt.",
@ -280,6 +281,7 @@
"edt_conf_color_magenta_title": "Bíborvörös",
"edt_conf_color_red_expl": "Piros érték kalibrálva.",
"edt_conf_color_red_title": "Piros",
"edt_conf_color_saturationGain_expl": "A színek telítettségét beállítja. 1.0 nem jelent változást, 1.0 feletti szám növeli a telítettséget, 1.0 alatti csökkenti.",
"edt_conf_color_white_expl": "Fehér érték kalibrálva.",
"edt_conf_color_white_title": "Fehér",
"edt_conf_color_yellow_expl": "Sárga érték kalibrálva.",
@ -435,8 +437,6 @@
"edt_conf_smooth_heading_title": "Simítás",
"edt_conf_smooth_interpolationRate_expl": "Sima köztes képkockák számítási sebessége.",
"edt_conf_smooth_interpolationRate_title": "Interpolációs arány",
"edt_conf_smooth_outputRate_expl": "A LED-vezérlő kimeneti sebessége.",
"edt_conf_smooth_outputRate_title": "Kimeneti sebesség",
"edt_conf_smooth_time_ms_expl": "Mennyi ideig kell a simító képeket gyűjteni?",
"edt_conf_smooth_time_ms_title": "Idő",
"edt_conf_smooth_type_expl": "A simítás típusa.",
@ -515,8 +515,6 @@
"edt_conf_webc_keyPath_title": "Privát kulcs elérési útja",
"edt_conf_webc_sslport_expl": "A HTTPS-Websarver Portja",
"edt_conf_webc_sslport_title": "HTTPS Port",
"edt_dev_auth_key_title": "Hitelesítési token",
"edt_dev_auth_key_title_info": "A készülék csatlakoztatásához szükséges hitelesítési token",
"edt_dev_enum_sub_min_cool_adjust": "Kivonja a hideg fehéret",
"edt_dev_enum_sub_min_warm_adjust": "Kivonja a meleg fehéret",
"edt_dev_enum_subtract_minimum": "Kivonja a minimumot",
@ -542,6 +540,8 @@
"edt_dev_spec_baudrate_title": "Átviteli sebesség",
"edt_dev_spec_blackLightsTimeout_title": "A jelérzékelés időtúllépése feketén",
"edt_dev_spec_brightnessFactor_title": "Fényerő",
"edt_dev_spec_brightnessMax_title": "Fényerő maximum",
"edt_dev_spec_brightnessMin_title": "Fényerő minimum",
"edt_dev_spec_brightnessOverwrite_title": "Felülírja a fényerősséget",
"edt_dev_spec_brightnessThreshold_title": "Jelérzékelés fényerő minimum",
"edt_dev_spec_brightness_title": "Fényerősség",
@ -565,7 +565,6 @@
"edt_dev_spec_gpioBcm_title": "GPIO PIN",
"edt_dev_spec_gpioMap_title": "GPIO leképezés",
"edt_dev_spec_gpioNumber_title": "GPIO-szám",
"edt_dev_spec_groupId_title": "Csoport ID",
"edt_dev_spec_header_title": "Speciális beállítások",
"edt_dev_spec_interpolation_title": "Interpoláció",
"edt_dev_spec_intervall_title": "Intervallum",
@ -802,7 +801,7 @@
"effectsconfigurator_label_intro": "Hozzon létre az alapeffektusokból új effektusokat, amelyeket ízlése szerint hangol. Az effektustól függően olyan lehetőségek állnak rendelkezésre, mint a szín, a sebesség, az irány és egyebek.",
"general_access_advanced": "Haladó",
"general_access_default": "Alapméretezett",
"general_access_expert": "Expert",
"general_access_expert": "Szakértő",
"general_btn_back": "Vissza",
"general_btn_cancel": "Mégse",
"general_btn_continue": "Tovább",
@ -828,6 +827,7 @@
"general_col_blue": "kék",
"general_col_green": "zöld",
"general_col_red": "piros",
"general_comp_AUDIO": "Hangrögzítés",
"general_comp_BLACKBORDER": "Fekete sáv észlelő",
"general_comp_BOBLIGHTSERVER": "Boblight Szerver",
"general_comp_FLATBUFSERVER": "Flatbuffers Szerver",
@ -993,16 +993,16 @@
"wiz_atmoorb_desc2": "Most válassza ki, hogy mely gömböket szeretné hozzáadni. A pozíció hozzárendeli a lámpát egy adott pozícióhoz a „képen”. A letiltott lámpák nem kerülnek hozzáadásra. Az egyes lámpák azonosításához nyomja meg a jobb oldalon található gombot.",
"wiz_atmoorb_intro1": "Ez a varázsló konfigurálja a Hyperiont az AtmoOrbs számára. Jellemzők az AtmoOrb automatikus felismerése, amely minden lámpát egy adott pozícióba állít a képen, vagy letiltja, és automatikusan optimalizálja a Hyperion beállításait! Tehát röviden: mindössze néhány kattintásra van szüksége, és kész! ",
"wiz_atmoorb_title": "AtmoOrb varázsló",
"wiz_cc_adjustgamma": "Gamma: annyit kell tennie, hogy állítsa be az egyes csatornák gammaszintjét, amíg az egyes csatornák észlelt szintje azonos lesz. Tipp: A természetes az 1.0! Például, ha a szürke egy kicsit vöröses, az azt jelenti, hogy növelnie kell a vörös gammát, hogy csökkentse a vörös mennyiségét (minél több a gamma, annál kevesebb a szín). ",
"wiz_cc_adjustit": "Addig állítsa be a \"$1\" értéket, amíg jól nem lesz. Figyelem: Minél jobban eltér az alapértelmezett értéktől, a színspektrum korlátozott lesz (a közöttük lévő összes színre is). A TV/LED színspektrumától függően az eredmények eltérőek lehetnek. ",
"wiz_cc_backlight": "Beállíthat egy háttérvilágítást a \"rossz színek\" kiszűrésére a majdnem sötét területeken, vagy ha nem szereti a színek és a kikapcsolás közötti váltást nézés közben. Továbbá meghatározhatja, hogy legyen valamilyen szín vagy csak fehér. Ez le van tiltva \"Ki\", \"Szín\" és \"Effektus\" állapotban. ",
"wiz_cc_adjustgamma": "Gamma: annyit kell tennie, hogy állítsa be az egyes csatornák gammaszintjét, amíg az egyes csatornák észlelt szintje azonos lesz. Tipp: A természetes az 1.0! Például, ha a szürke egy kicsit vöröses, az azt jelenti, hogy növelnie kell a vörös gammát, hogy csökkentse a vörös mennyiségét (minél több a gamma, annál kevesebb a szín).",
"wiz_cc_adjustit": "Addig állítsa be a \"$1\" értéket, amíg jól nem lesz. Figyelem: Minél jobban eltér az alapértelmezett értéktől, a színspektrum korlátozott lesz (a közöttük lévő összes színre is). A TV/LED színspektrumától függően az eredmények eltérőek lehetnek.",
"wiz_cc_backlight": "Beállíthat egy háttérvilágítást a \"rossz színek\" kiszűrésére a majdnem sötét területeken, vagy ha nem szereti a színek és a kikapcsolás közötti váltást nézés közben. Továbbá meghatározhatja, hogy legyen valamilyen szín vagy csak fehér. Ez le van tiltva \"Ki\", \"Szín\" és \"Effektus\" állapotban.",
"wiz_cc_btn_stop": "Videó leállítása",
"wiz_cc_btn_switchpic": "Kapcsolja be a képet",
"wiz_cc_chooseid": "Adja meg a színes profil nevét.",
"wiz_cc_intro1": "Ez a varázsló végigvezeti Önt a LED-kalibráláson. Ha Kodi-t használ, a kalibrációs képeket és videókat közvetlenül elküldheti rá. Előfeltétel: Engedélyeznie kell a \"Távvezérlés engedélyezése más rendszereken lévő alkalmazásokból\" lehetőséget a Kodiban.<br />Alternatív megoldásként érdemes saját maga letöltenie ezeket a fájlokat, és megjeleníteni őket, amikor a varázsló a beállítás módosítását kéri.",
"wiz_cc_kodicon": "Kodi megtalálva, folytassa a Kodi támogatásával.",
"wiz_cc_kodidiscon": "A Kodi nem található, folytassa KODI támogatás nélkül (kérjük, ellenőrizze, ha más rendszerek távvezérlése aktiválva van).",
"wiz_cc_kodidisconlink": "Link képek letöltése",
"wiz_cc_kodidisconlink": "Link képek letöltése:",
"wiz_cc_kodimsg_start": "Teszt sikeres - ideje folytatni!",
"wiz_cc_kodishould": "A Kodinak a következő képet kell mutatnia: $1",
"wiz_cc_kwebs": "Kodi Webserver (HostName vagy IP)",
@ -1010,8 +1010,8 @@
"wiz_cc_lettvshowm": "Ellenőrizze ezt a következő képekkel: $1",
"wiz_cc_link": "Kattints ide!",
"wiz_cc_morethanone": "Több profilod van, kérjük, válassza ki a kalibrálni kívánt profilt.",
"wiz_cc_summary": "A videolejátszás során újra megváltoztathatja vagy tesztelheti az értékeket. Ha végzett, kattintson a Mentés gombra.",
"wiz_cc_testintro": "Ideje egy igazi tesztnek! ",
"wiz_cc_summary": "A beállításaid összefoglalója. A videolejátszás során újra megváltoztathatja vagy tesztelheti az értékeket. Ha végzett, kattintson a Mentés gombra.",
"wiz_cc_testintro": "Ideje egy igazi tesztnek!",
"wiz_cc_testintrok": "Nyomja meg az alábbi gombot a teszt videó elindításához.",
"wiz_cc_testintrowok": "Tekintse meg a következő linket a teszt videók letöltéséhez:",
"wiz_cc_title": "Szín kalibráló varázsló",
@ -1021,7 +1021,6 @@
"wiz_cololight_noprops": "Nem lehet lekérni az eszköz tulajdonságait Határozza meg kézzel a hardver LED-ek számát",
"wiz_cololight_title": "Cololight varázsló",
"wiz_guideyou": "Az $ 1 a beállítások segítségével. Csak nyomja meg a gombot!",
"wiz_hue_blinkblue": "Hagyja, hogy az ID $1 kéken világítson",
"wiz_hue_clientkey": "Ügyfélkulcs",
"wiz_hue_create_user": "Új felhasználó létrehozása",
"wiz_hue_desc1": "1. A Hyperion automatikusan megkeresi a Hue-Bridge-et, ha nem talál egyet, meg kell adnia a gazdagép nevét vagy IP-címét, és meg kell nyomnia az újratöltés gombot. <br> 2. Adjon meg felhasználói azonosítót, ha nincs, hozzon létre újat.",

View File

@ -0,0 +1,266 @@
{
"conf_colors_blackborder_intro": "Lewati bar hitam di mana pun mereka berada. Setiap mode menggunakan algoritme pendeteksian lain yang disetel untuk situasi khusus. Tinggikan ambang batas jika tidak berhasil untuk Anda.",
"conf_colors_color_intro": "Buat satu atau beberapa profil kalibrasi, sesuaikan setiap warna, kecerahan, linearisasi, dan lainnya.",
"conf_colors_smoothing_intro": "Smoothing meratakan perubahan warna/kecerahan untuk mengurangi gangguan yang mengganggu.",
"conf_effect_bgeff_intro": "Menentukan efek/warna latar belakang, yang ditampilkan selama Hyperion \"idle\". Selalu dimulai dengan channel prioritas 255.",
"conf_effect_fgeff_intro": "Tentukan efek boot atau warna, yang ditampilkan sewaktu Hyperion dinyalakan selama durasi yang ditentukan.",
"conf_effect_path_intro": "Memuat efek dari jalur yang ditentukan. Tambahan Anda dapat menonaktifkan efek tunggal berdasarkan nama untuk menyembunyikannya dari semua daftar efek.",
"conf_general_impexp_expbtn": "Ekspor",
"conf_general_impexp_impbtn": "Impor",
"conf_general_impexp_l1": "Impor konfigurasi dengan memilih file konfigurasi di bawah ini dan klik \"Impor\".",
"conf_general_impexp_l2": "Ekspor konfigurasi dengan mengklik \"Ekspor\". Peramban Anda akan memulai pengunduhan.",
"conf_general_impexp_title": "Konfigurasi Impor/Ekspor",
"conf_general_intro": "Pengaturan dasar di sekitar Hyperion dan WebUI yang tidak sesuai dengan kategori lain.",
"conf_general_label_title": "Pengaturan Umum",
"conf_grabber_fg_intro": "Screen capture adalah tangkapan layar sistem lokal Anda sebagai sumber input, tempat Hyperion diinstal.",
"conf_grabber_v4l_intro": "USB capture adalah perangkat (capture) yang terhubung melalui USB yang digunakan untuk memasukkan gambar sumber untuk diproses.",
"conf_helptable_expl": "Penjelasan",
"conf_helptable_option": "Opsi",
"conf_leds_contr_label_contrtype": "Tipe kontroler:",
"conf_leds_device_intro": "Hyperion mendukung banyak kontroler untuk mengirimkan data ke perangkat target Anda. Pilih kontroler LED dari daftar yang sudah diurutkan dan di konfigurasikan. Kami telah memilih pengaturan default terbaik untuk setiap perangkat.",
"conf_leds_layout_advanced": "Pengaturan Tingkat Lanjut",
"conf_leds_layout_btn_checklist": "Tampilkan checklist",
"conf_leds_layout_button_savelay": "Simpan Layout",
"conf_leds_layout_button_updsim": "Perbarui Preview",
"conf_leds_layout_checkp1": "LED hitam adalah LED pertama Anda, LED pertama adalah titik di mana Anda memasukkan sinyal data Anda.",
"conf_leds_layout_checkp2": "Layout ini selalu tampak dari depan TV Anda, tidak pernah dari belakang.",
"conf_leds_layout_checkp3": "Pastikan arahnya sudah benar. LED abu-abu menunjukkan LED nomor 2 dan 3 untuk memvisualisasikan arah data.",
"conf_leds_layout_checkp4": "Gap: Untuk membuat gap, abaikan terlebih dulu ketika Anda menentukan Atas/Bawah/Kiri/Kanan, kemudian tetapkan panjang gap Anda untuk menghilangkan sejumlah led. Ubah posisi gap sampai sesuai.",
"conf_leds_layout_cl_bottom": " Bawah",
"conf_leds_layout_cl_cornergap": "Gap Sudut",
"conf_leds_layout_cl_edgegap": "Gap Tepi",
"conf_leds_layout_cl_gaglength": "Panjang gap",
"conf_leds_layout_cl_gappos": "posisi gap",
"conf_leds_layout_cl_hleddepth": "Kedalaman LED horizontal",
"conf_leds_layout_cl_inppos": "Posisi input",
"conf_leds_layout_cl_left": "Kiri",
"conf_leds_layout_cl_overlap": "Overlap",
"conf_leds_layout_cl_reversdir": "Membalikkan arah",
"conf_leds_layout_cl_right": "Kanan",
"conf_leds_layout_cl_top": "Atas",
"conf_leds_layout_cl_vleddepth": "Kedalaman LED vertikal",
"conf_leds_layout_frame": "Layout Klasik (Bingkai LED)",
"conf_leds_layout_generatedconf": "Konfigurasi LED yang Dihasilkan/Saat Ini",
"conf_leds_layout_intro": "Anda juga memerlukan tata letak LED, yang mencerminkan posisi LED Anda. Layout klasik yang biasanya dipakai adalah bingkai TV, tetapi kami juga mendukung pembuatan matriks LED (LED Walls). Tampilan pada tata letak ini SELALU dari DEPAN TV Anda.",
"conf_leds_layout_ma_cabling": "Pengkabelan",
"conf_leds_layout_ma_horiz": "Horisontal",
"conf_leds_layout_ma_optbottomleft": "Kiri bawah",
"conf_leds_layout_ma_optbottomright": "Kanan bawah",
"conf_leds_layout_ma_opthoriz": "Horisontal",
"conf_leds_layout_ma_optparallel": "Paralel",
"conf_leds_layout_ma_optsnake": "Snake",
"conf_leds_layout_ma_opttopleft": "Kiri Atas",
"conf_leds_layout_ma_opttopright": "Kanan atas",
"conf_leds_layout_ma_optvert": "Vertikal",
"conf_leds_layout_ma_order": "Order",
"conf_leds_layout_ma_position": "Input",
"conf_leds_layout_ma_vert": "Vertikal",
"conf_leds_layout_matrix": "Layout Matriks (Dinding LED)",
"conf_leds_layout_peview": "Preview Layout LED",
"conf_leds_layout_preview_l1": "Ini adalah LED pertama Anda (posisi input)",
"conf_leds_layout_preview_l2": "Ini memvisualisasikan arah data (LED kedua/ketiga)",
"conf_leds_layout_preview_ledpower": "Maks. konsumsi daya: $1 A",
"conf_leds_layout_preview_originCL": "Dibuat dari: Layout Klasik (Bingkai LED)",
"conf_leds_layout_preview_originMA": "Dibuat dari: Layout Matriks (Dinding LED)",
"conf_leds_layout_preview_originTEXT": "Dibuat dari: Textfield",
"conf_leds_layout_preview_totalleds": "Total LED: $1",
"conf_leds_layout_ptlh": "Horisontal",
"conf_leds_layout_ptlv": "Vertikal",
"conf_leds_layout_textf1": "Kolom teks ini menunjukkan secara default layout yang dimuat saat ini dan akan ditimpa jika Anda membuat layout baru dengan opsi-opsi di atas. Secara opsional, Anda dapat melakukan pengeditan lebih lanjut.",
"conf_leds_nav_label_ledcontroller": "Kontroler LED",
"conf_leds_nav_label_ledlayout": "Tata Letak LED",
"conf_leds_optgroup_RPiGPIO": "RPi GPIO",
"conf_leds_optgroup_RPiPWM": "RPi PWM",
"conf_leds_optgroup_RPiSPI": "RPi SPI",
"conf_leds_optgroup_network": "Jaringan",
"conf_leds_optgroup_usb": "USB/Serial",
"conf_logging_btn_autoscroll": "Scrolling otomatis",
"conf_logging_btn_pbupload": "Unggah laporan untuk permintaan dukungan",
"conf_logging_contpolicy": "Report Privacy Policy",
"conf_logging_label_intro": "Area untuk memeriksa pesan log, Anda akan melihat lebih banyak atau lebih sedikit informasi tergantung pada tingkat logging yang ditetapkan.",
"conf_logging_lastreports": "Laporan sebelumnya",
"conf_logging_nomessage": "Tidak ada pesan log yang tersedia.",
"conf_logging_report": "Laporan",
"conf_logging_uplfailed": "Gagal mengunggah! Silakan periksa koneksi internet Anda!",
"conf_logging_uploading": "Menyiapkan data...",
"conf_logging_uplpolicy": "Dengan mengklik tombol ini, Anda menyetujui",
"conf_logging_yourlink": "Tautan ke laporan Anda",
"conf_network_bobl_intro": "Receiver untuk Boblight",
"conf_network_fbs_intro": "Receiver Google Flatbuffers. Digunakan untuk transmisi gambar yang cepat.",
"conf_network_forw_intro": "Meneruskan semua input ke instalasi Hyperion kedua yang dapat dikendalikan dengan kontroler LED lain",
"conf_network_json_intro": "JSON-RPC-Port dari semua instance Hyperion, yang digunakan untuk kontrol jarak jauh.",
"conf_network_proto_intro": "PROTO-Port dari semua contoh Hyperion, digunakan untuk streaming gambar (HyperionScreenCap, Kodi Addon, Android Hyperion Grabber, ...)",
"conf_webconfig_label_intro": "Pengaturan konfigurasi web. Edit dengan bijak.",
"dashboard_alert_message_confedit": "Konfigurasi Hyperion Anda telah dimodifikasi. Untuk menerapkannya, mulai ulang Hyperion.",
"dashboard_alert_message_confedit_t": "Konfigurasi yang dimodifikasi",
"dashboard_alert_message_confsave_success": "Konfigurasi Hyperion Anda telah berhasil disimpan. Perubahan yang Anda buat sekarang sudah aktif.",
"dashboard_alert_message_confsave_success_t": "Konfigurasi disimpan",
"dashboard_alert_message_disabled": "Instance ini saat ini dinonaktifkan! Untuk menggunakannya lagi, aktifkan di dasbor.",
"dashboard_alert_message_disabled_t": "perangkat keras LED dinonaktifkan",
"dashboard_componentbox_label_comp": "Komponen",
"dashboard_componentbox_label_status": "Status",
"dashboard_componentbox_label_title": "Status komponen",
"dashboard_infobox_label_currenthyp": "Versi Hyperion Anda:",
"dashboard_infobox_label_disableh": "Matikan Instance: $1",
"dashboard_infobox_label_enableh": "Aktifkan Instance: $1",
"dashboard_infobox_label_instance": "Instance:",
"dashboard_infobox_label_latesthyp": "Versi Hyperion Terbaru:",
"dashboard_infobox_label_platform": "Platform:",
"dashboard_infobox_label_ports": "Ports",
"dashboard_infobox_label_smartacc": "Akses Cerdas",
"dashboard_infobox_label_statush": "Status Hyperion:",
"dashboard_infobox_label_title": "Information",
"dashboard_infobox_message_updatesuccess": "Anda menjalankan Hyperion versi terbaru.",
"dashboard_infobox_message_updatewarning": "Versi terbaru dari Hyperion telah tersedia! ($1)",
"dashboard_label_intro": "Dasbor memberi Anda gambaran umum singkat tentang status Hyperion",
"dashboard_newsbox_label_title": "Hyperion-Blog",
"dashboard_newsbox_noconn": "Tidak dapat terhubung ke Server Hyperion untuk mengambil postingan terbaru, apakah koneksi internet Anda berfungsi?",
"dashboard_newsbox_readmore": "Baca lebih lanjut",
"dashboard_newsbox_visitblog": "Kunjungi Hyperion-Blog",
"edt_conf_bobls_heading_title": "Server Boblight",
"edt_conf_color_blue_title": "Biru",
"edt_conf_color_green_title": "Hijau",
"edt_conf_color_red_title": "Merah",
"edt_conf_enum_HORIZONTAL": "Horisontal",
"edt_conf_enum_VERTICAL": "Vertikal",
"edt_conf_enum_bbdefault": "bawaan",
"edt_conf_fbs_heading_title": "Server Flatbuffer",
"edt_conf_fg_type_title": "Tipe",
"edt_conf_fge_type_title": "Tipe",
"edt_conf_fw_heading_title": "Forwarder",
"edt_conf_gen_heading_title": "Pengaturan Umum",
"edt_conf_net_heading_title": "Jaringan",
"edt_conf_pbs_heading_title": "Server Buffer Protokol",
"edt_conf_smooth_heading_title": "Menghaluskan",
"edt_conf_smooth_type_title": "Tipe",
"edt_conf_v4l2_heading_title": "Capture USB-Input",
"edt_conf_v4l2_input_title": "Input",
"edt_conf_webc_heading_title": "Konfigurasi Web",
"edt_dev_general_heading_title": "Pengaturan Umum",
"edt_eff_reversedirection": "Membalikkan arah",
"edt_eff_snake_header": "Snake",
"effectsconfigurator_button_conttest": "Tes terus menerus",
"effectsconfigurator_button_deleffect": "Hapus Efek",
"effectsconfigurator_button_editeffect": "Load Effect",
"effectsconfigurator_button_saveeffect": "Simpan Efek",
"effectsconfigurator_button_starttest": "Mulai tes",
"effectsconfigurator_button_stoptest": "Hentikan tes",
"effectsconfigurator_editdeleff": "Menghapus/Memuat Efek",
"effectsconfigurator_label_chooseeff": "Pilih Template",
"effectsconfigurator_label_effectname": "Nama efek",
"effectsconfigurator_label_intro": "Menciptakan efek baru dari efek dasar yang disesuaikan dengan keinginan Anda. Tergantung pada Efek, tersedia opsi seperti warna, kecepatan, arah dan lainnya.",
"general_access_advanced": "Tingkat lanjut",
"general_access_default": "bawaan",
"general_access_expert": "Ahli",
"general_btn_back": "Kembali",
"general_btn_cancel": "Batal",
"general_btn_continue": "Lanjut",
"general_btn_iswitch": "Saklar",
"general_btn_next": "Berikutnya",
"general_btn_off": "Mati",
"general_btn_ok": "OK",
"general_btn_on": "Hidup",
"general_btn_restarthyperion": "Muat Ulang Hyperion",
"general_btn_save": "Simpan",
"general_btn_saveandreload": "Simpan dan Muat Ulang",
"general_btn_yes": "Iya",
"general_button_savesettings": "Simpan Pengaturan",
"general_col_blue": "Biru",
"general_col_green": "Hijau",
"general_col_red": "Merah",
"general_comp_BLACKBORDER": "Pendeteksi Blackbar",
"general_comp_BOBLIGHTSERVER": "Server Boblight",
"general_comp_FLATBUFSERVER": "Server Flatbuffer",
"general_comp_FORWARDER": "Forwarder",
"general_comp_GRABBER": "Capture Screen",
"general_comp_LEDDEVICE": "Output LED",
"general_comp_PROTOSERVER": "Server Buffer Protokol",
"general_comp_SMOOTHING": "Menghaluskan",
"general_comp_V4L": "Capture USB-Input",
"general_country_de": "German",
"general_country_es": "Spanyol",
"general_country_fr": "Prancis",
"general_country_it": "Itali",
"general_country_nl": "Belanda",
"general_country_uk": "Inggris",
"general_country_us": "Amerika Serikat",
"general_speech_cs": "Ceko",
"general_speech_de": "German",
"general_speech_en": "Inggris",
"general_speech_es": "Spanyol",
"general_speech_it": "Itali",
"general_webui_title": "Hyperion - Konfigurasi Web",
"general_wiki_moreto": "Informasi lebih lanjut tentang \"$1\" di Wiki kami",
"main_ledsim_btn_togglelednumber": "Nomor LED",
"main_ledsim_btn_toggleleds": "Tampilkan LED",
"main_ledsim_btn_togglelivevideo": "Vidio Langsung",
"main_ledsim_text": "Visualisasi langsung warna LED dan opsional stream video saat ini dari capture card Anda.",
"main_ledsim_title": "Visualisasi LED",
"main_menu_about_token": "Tentang Hyperion",
"main_menu_colors_conf_token": "Pemrosesan Gambar",
"main_menu_configuration_token": "Instance LED",
"main_menu_dashboard_token": "Dashboard",
"main_menu_effect_conf_token": "Efek",
"main_menu_effectsconfigurator_token": "Konfigurator Efek",
"main_menu_general_conf_token": "Umum",
"main_menu_grabber_conf_token": "Capturing Hardware",
"main_menu_input_selection_token": "Pilihan Input",
"main_menu_leds_conf_token": "Output LED",
"main_menu_logging_token": "Log",
"main_menu_network_conf_token": "Layanan Jaringan",
"main_menu_remotecontrol_token": "Remote Kontrol",
"main_menu_support_token": "Dukungan",
"main_menu_system_token": "Sistem",
"main_menu_update_token": "Perbarui",
"main_menu_webconfig_token": "Konfigurasi Web",
"remote_adjustment_intro": "Memodifikasi warna/kecerahan/kompensasi pada saat runtime. $1",
"remote_adjustment_label": "Penyesuaian warna",
"remote_color_button_reset": "Reset Warna/Efek",
"remote_color_intro": "Menetapkan efek atau warna. Dan juga, efek yang Anda ciptakan sendiri, juga dicantumkan (jika tersedia). $1",
"remote_color_label": "Warna/Efek",
"remote_color_label_color": "Warna:",
"remote_components_intro": "Mengaktifkan dan menonaktifkan komponen Hyperion selama waktu berjalan. $1",
"remote_components_label": "Kontrol komponen",
"remote_effects_label_effects": "Efek:",
"remote_input_clearall": "Menghapus semua Efek/Warna",
"remote_input_duration": "Durasi:",
"remote_input_intro": "Hyperion menggunakan sistem prioritas untuk memilih source. Semua yang Anda tetapkan memiliki prioritas (Efek/Warna/Tangkapan layar/tangkapan USB dan sumber jaringan). Secara default, Hyperion memilih sumber tergantung pada prioritas (angka terendah mencerminkan sumber yang aktif saat ini). Sekarang Anda memiliki kesempatan untuk memilih sumber sendiri. $1",
"remote_input_ip": "IP:",
"remote_input_label": "Pemilihan Source",
"remote_input_label_autoselect": "Pilihan Otomatis",
"remote_input_origin": "Asal",
"remote_input_owner": "Tipe",
"remote_input_priority": "Priority",
"remote_input_setsource_btn": "Pilih Source",
"remote_input_sourceactiv_btn": "Source aktif",
"remote_input_status": "Status/Tindakan",
"remote_losthint": "Catatan: Semua perubahan akan hilang setelah restart.",
"remote_maptype_intro": "Biasanya tata-letak LED menentukan LED mana yang mencakup area gambar tertentu. Anda dapat mengubahnya di sini: $1.",
"remote_maptype_label": "Jenis pemetaan",
"remote_maptype_label_multicolor_mean": "Berarti Warna Sederhana",
"remote_maptype_label_unicolor_mean": "Berarti Gambar Berwarna",
"remote_optgroup_syseffets": "Efek Sistem",
"remote_optgroup_usreffets": "Efek Pengguna",
"remote_videoMode_2D": "2D",
"remote_videoMode_3DSBS": "3DSBS",
"remote_videoMode_3DTAB": "3DTAB",
"remote_videoMode_intro": "Beralih di antara mode video yang berbeda untuk menikmati film 3D! Semua perangkat perekaman didukung. $1",
"remote_videoMode_label": "Mode video",
"support_label_affinstr1": "Klik tautan yang sesuai dengan negara Anda",
"support_label_affinstr2": "Semua yang Anda beli (apa pun itu), kami akan mendapatkan sedikit biaya berdasarkan turnover Anda",
"support_label_affinstr3": "Anda SELALU membayar dengan harga yang sama, sama sekali tidak ada perbedaan. Cobalah!",
"support_label_btctext": "Alamat:",
"support_label_donate": "Donasi atau gunakan tautan afiliasi kami",
"support_label_donationpp": "Donasi:",
"support_label_fbtext": "Bagikan halaman Facebook Hyperion kami dan dapatkan pemberitahuan ketika pembaruan baru dirilis",
"support_label_ggtext": "Circle us on Google +!",
"support_label_igtext": "Kunjungi kami di Instagram untuk melihat foto-foto Hyperion terbaru!",
"support_label_intro": "Hyperion adalah sebuah software gratis non-profit. Dikembangkan dengan tim yang kecil dan karena itulah kami membutuhkan dukungan Anda.",
"support_label_spreadtheword": "Sebarkan berita",
"support_label_title": "Dukung Hyperion",
"support_label_twtext": "Bagikan dan ikuti di Twitter, selalu dapatkan informasi terbaru tentang perkembangan Hyperion",
"support_label_webpagetext": "Rumah dari Hyperion",
"support_label_webpagetitle": "Halaman web",
"support_label_webrestitle": "Sumber daya informasi dan bantuan",
"support_label_yttext": "Bosan dengan gambar? Lihat saluran YouTube kami!"
}

View File

@ -517,8 +517,6 @@
"edt_conf_webc_keyPath_title": "Percorso della chiave privata",
"edt_conf_webc_sslport_expl": "Porta del webserver HTTPS",
"edt_conf_webc_sslport_title": "Porta HTTPS",
"edt_dev_auth_key_title": "Token di autenticazione",
"edt_dev_auth_key_title_info": "Token di autenticazione necessario per accedere al dispositivo",
"edt_dev_enum_sub_min_cool_adjust": "Regolazione freddo min",
"edt_dev_enum_sub_min_warm_adjust": "Regolazione calore min",
"edt_dev_enum_subtract_minimum": "Sottrai minimo",
@ -571,7 +569,7 @@
"edt_dev_spec_gpioBcm_title": "Pin GPIO",
"edt_dev_spec_gpioMap_title": "Mappatura GPIO",
"edt_dev_spec_gpioNumber_title": "Numero GPIO",
"edt_dev_spec_groupId_title": "ID Gruppo",
"edt_dev_spec_groupId_title": "Gruppo",
"edt_dev_spec_header_title": "Impostazioni specifiche",
"edt_dev_spec_interpolation_title": "Interpolazione",
"edt_dev_spec_intervall_title": "Intervallo",
@ -1034,7 +1032,6 @@
"wiz_cololight_noprops": "Impossibile ottenere le proprietà del dispositivo: definire manualmente il numero dei LED",
"wiz_cololight_title": "Cololight Wizard",
"wiz_guideyou": "$1 ti guiderà tra le impostazioni. Ti basta premere il bottone!",
"wiz_hue_blinkblue": "ID $1 si illumina di blu",
"wiz_hue_clientkey": "Clientkey:",
"wiz_hue_create_user": "Crea un nuovo Utente",
"wiz_hue_desc1": "Cerca automaticamente un hue bridge, nel caso in cui non ne trovi una devi fornire un indirizzo ip e premere il bottone ricarica sulla destra. Hai anche bisogno di un user id, se non ne hai uno creane uno nuovo.",

View File

@ -132,7 +132,6 @@
"edt_conf_v4l2_device_title": "デバイス",
"edt_conf_v4l2_heading_title": "USBキャプチャ",
"edt_conf_v4l2_standard_title": "ビデオスタンダード",
"edt_dev_auth_key_title": "認証トークン",
"edt_dev_enum_sub_min_cool_adjust": "クールホワイトを減らす",
"edt_dev_enum_sub_min_warm_adjust": "ワームホワイトを減らす",
"edt_dev_general_autostart_title": "オートスタート",

View File

@ -391,8 +391,6 @@
"edt_conf_smooth_heading_title": "Verzachten",
"edt_conf_smooth_interpolationRate_expl": "Snelheid van de berekening van gladde tussenliggende frames.",
"edt_conf_smooth_interpolationRate_title": "Interpolatietempo",
"edt_conf_smooth_outputRate_expl": "De uitgangssnelheid naar uw LED-controller.",
"edt_conf_smooth_outputRate_title": "Uitgangstempo",
"edt_conf_smooth_time_ms_expl": "Hoe lang moet de verzachting beeld ontvangen?",
"edt_conf_smooth_time_ms_title": "Tijd",
"edt_conf_smooth_type_expl": "Type verzachting",
@ -451,8 +449,6 @@
"edt_conf_webc_keyPath_title": "Pad met privésleutel",
"edt_conf_webc_sslport_expl": "Poort van de HTTPS-webserver",
"edt_conf_webc_sslport_title": "HTTPS-poort",
"edt_dev_auth_key_title": "Authenticatie token",
"edt_dev_auth_key_title_info": "Verificatietoken vereist voor toegang tot het apparaat",
"edt_dev_enum_sub_min_cool_adjust": "Verlaag koel wit",
"edt_dev_enum_sub_min_warm_adjust": "Verlaag warm wit",
"edt_dev_enum_subtract_minimum": "Verlaag minimum",
@ -472,8 +468,6 @@
"edt_dev_spec_baudrate_title": "Baudrate",
"edt_dev_spec_blackLightsTimeout_title": "Signaaldetectie-timeout op zwart",
"edt_dev_spec_brightnessFactor_title": "Helderheidsfactor ",
"edt_dev_spec_brightnessMax_title": "Maximale helderheid",
"edt_dev_spec_brightnessMin_title": "Minimale helderheid",
"edt_dev_spec_brightnessOverwrite_title": "Overschrijf helderheid ",
"edt_dev_spec_brightnessThreshold_title": "Signaaldetectie helderheid minimaal",
"edt_dev_spec_brightness_title": "Helderheid",
@ -482,7 +476,6 @@
"edt_dev_spec_clientKey_title": "Klantensleutel",
"edt_dev_spec_colorComponent_title": "Kleurcomponent",
"edt_dev_spec_debugLevel_title": "Foutopsporingsniveau van Streamer-verbinding",
"edt_dev_spec_debugStreamer_title": "Streamer Debug",
"edt_dev_spec_delayAfterConnect_title": "Vertraging na connectie",
"edt_dev_spec_devices_discovered_none": "Geen apparaten gevonden ",
"edt_dev_spec_devices_discovered_title": "Apparaten gevonden",
@ -497,7 +490,6 @@
"edt_dev_spec_gpioBcm_title": "GPIO Pin",
"edt_dev_spec_gpioMap_title": "GPIO mapping",
"edt_dev_spec_gpioNumber_title": "GPIO nummer",
"edt_dev_spec_groupId_title": "Groeps-ID",
"edt_dev_spec_header_title": "Specifieke instellingen",
"edt_dev_spec_interpolation_title": "Tussenvoeging",
"edt_dev_spec_intervall_title": "Interval",
@ -533,7 +525,6 @@
"edt_dev_spec_spipath_title": "SPI pad",
"edt_dev_spec_sslHSTimeoutMax_title": "Maximale time-out voor handshake van Streamer",
"edt_dev_spec_sslHSTimeoutMin_title": "Minimale time-out voor handdruk in Streamer",
"edt_dev_spec_sslReadTimeout_title": "Time-out bij lezen van Streamer",
"edt_dev_spec_switchOffOnBlack_title": "Schakel zwart uit",
"edt_dev_spec_switchOffOnbelowMinBrightness_title": "Uitschakelen, onder minimum",
"edt_dev_spec_syncOverwrite_title": "Synchronisatie uitschakelen",
@ -925,7 +916,7 @@
"wiz_cololight_noprops": "Kan apparaateigenschappen niet ophalen - Definieer het aantal LED's handmatig",
"wiz_cololight_title": "Cololight Wizard",
"wiz_guideyou": "De $1 zal je door de instellingen leiden. Druk gewoon op de knop!",
"wiz_hue_blinkblue": "Laat ID $1 blauw oplichten",
"wiz_hue_blinkblue": "Laat oplichten",
"wiz_hue_clientkey": "Klantensleutel:",
"wiz_hue_create_user": "Maak nieuwe gebruiker",
"wiz_hue_desc1": "Dit zoekt automatisch naar een Hue Bridge. Als deze niet gevonden kan worden, bepaal dan het IP adres en druk op de herstarten knop aan de rechterkant. Je hebt een User ID nodig. Heb je deze niet, maak er dan eerst eentje aan.",

View File

@ -44,6 +44,7 @@
"conf_general_inst_title": "Zarządzanie wystąpieniami sprzętu LED",
"conf_general_intro": "Podstawowe ustawienia Hyperion i WebUI, które nie pasują do żadnych innych kategorii.",
"conf_general_label_title": "Główne ustawienia",
"conf_grabber_audio_intro": "Przechwytywanie dźwięku wykorzystuje urządzenie wejściowe audio jako źródło wizualizacji.",
"conf_grabber_fg_intro": "\"Przechwytywanie pulpitu\" to Twój system lokalny, przechwytywany jako źródło wejściowe.",
"conf_grabber_inst_grabber_config_info": "Wcześniej skonfiguruj sprzęt do przechwytywania, który ma być używany przez instancję",
"conf_grabber_v4l_intro": "Funkcja przechwytywania USB używa urządzenia przechwytującego podłączonego przez USB do tego systemu.",
@ -58,7 +59,9 @@
"conf_leds_error_get_properties_title": "Właściwości urządzenia",
"conf_leds_error_hwled_gt_layout": "Sprzętowa liczba diod LED ($1) jest większa niż diod LED skonfigurowanych za pomocą układu ($2), <br>$3 {{plural:$3|LED|LEDs}} pozostaną czarne, jeśli będziesz kontynuować.",
"conf_leds_error_hwled_gt_maxled": "Liczba sprzętowych diod LED ($1) jest większa niż maksymalna liczba diod obsługiwanych przez urządzenie ($2). <br> Licznik sprzętowych diod LED jest ustawiony na ($3).",
"conf_leds_error_hwled_gt_maxled_protocol": "Sprzętowa liczba diod LED ($1) jest większa niż maksymalna liczba diod obsługiwanych przez protokół przesyłania strumieniowego ($12). <br> Protokół przesyłania strumieniowego zostanie zmieniony na ($3).",
"conf_leds_error_hwled_lt_layout": "Sprzętowa liczba diod LED ($1) jest mniejsza niż diody LED skonfigurowane w układzie ($2). <br> Liczba diod LED skonfigurowanych w układzie nie może przekraczać dostępnych diod LED",
"conf_leds_error_wled_segment_missing": "Aktualnie skonfigurowany segment ($1) nie jest skonfigurowany na Twoim urządzeniu WLED.<br>Może być konieczne sprawdzenie konfiguracji WLED!<br>Strona konfiguracji przedstawia bieżącą konfigurację WLED.",
"conf_leds_info_ws281x": "Hyperion musi działać z uprawnieniami 'root' dla tego typu kontrolera!",
"conf_leds_layout_advanced": "Ustawienia dodatkowe",
"conf_leds_layout_blacklist_num_title": "Liczba diod LED",
@ -232,6 +235,27 @@
"edt_append_pixel": "Piksel",
"edt_append_s": "s",
"edt_append_sdegree": "s/stopnień",
"edt_conf_audio_device_expl": "Wybrane urządzenie wejściowe audio",
"edt_conf_audio_device_title": "Urządzenie audio",
"edt_conf_audio_effect_enum_vumeter": "Miernik VU",
"edt_conf_audio_effect_hotcolor_expl": "Gorący kolor",
"edt_conf_audio_effect_hotcolor_title": "Gorący kolor",
"edt_conf_audio_effect_multiplier_expl": "Mnożnik wartości sygnału audio",
"edt_conf_audio_effect_multiplier_title": "Mnożnik",
"edt_conf_audio_effect_safecolor_expl": "Bezpieczny kolor",
"edt_conf_audio_effect_safecolor_title": "Bezpieczny kolor",
"edt_conf_audio_effect_safevalue_expl": "Próg bezpieczny",
"edt_conf_audio_effect_safevalue_title": "Próg bezpieczny",
"edt_conf_audio_effect_set_defaults": "Zresetuj do wartości domyślnych",
"edt_conf_audio_effect_tolerance_expl": "Tolerancja używana podczas automatycznego obliczania mnożnika sygnału w zakresie od 0 do 100",
"edt_conf_audio_effect_tolerance_title": "Tolerancja",
"edt_conf_audio_effect_warncolor_expl": "Kolor ostrzegawczy",
"edt_conf_audio_effect_warncolor_title": "Kolor ostrzegawczy",
"edt_conf_audio_effect_warnvalue_expl": "Próg ostrzegawczy",
"edt_conf_audio_effect_warnvalue_title": "Próg ostrzegawczy",
"edt_conf_audio_effects_expl": "Wybierz efekt dotyczący sposobu przekształcania sygnału audio",
"edt_conf_audio_effects_title": "Efekty audio",
"edt_conf_audio_heading_title": "Przechwytywanie dźwięku",
"edt_conf_bb_blurRemoveCnt_expl": "Liczba pikseli, które zostaną usunięte z wykrytej ramki w celu usunięcia rozmycia.",
"edt_conf_bb_blurRemoveCnt_title": "Rozmycie pikseli",
"edt_conf_bb_borderFrameCnt_expl": "Liczba ramek przed ustawieniem spójnego wykrytego obramowania.",
@ -247,6 +271,8 @@
"edt_conf_bb_unknownFrameCnt_title": "Nieznane ramki",
"edt_conf_bge_heading_title": "Efekt/kolor tła",
"edt_conf_bobls_heading_title": "Server Boblight",
"edt_conf_color_accuracyLevel_expl": "Określ, jak dokładnie oceniane są kolory dominujące. Wyższy poziom zapewnia dokładniejsze wyniki, ale wymaga również większej mocy obliczeniowej. Powinno być połączone ze zmniejszonym przetwarzaniem pikseli.",
"edt_conf_color_accuracyLevel_title": "Poziom dokładności",
"edt_conf_color_backlightColored_expl": "Dodaj trochę koloru do podświetlenia.",
"edt_conf_color_backlightColored_title": "Kolorowe podświetlenie",
"edt_conf_color_backlightThreshold_expl": "Minimalna jasność (podświetlenie). Wyłączone podczas efektów, kolorów i statusu „Wyłączony”",
@ -285,6 +311,8 @@
"edt_conf_color_magenta_title": "Magenta",
"edt_conf_color_red_expl": "Skalibrowana wartość koloru czerwonego",
"edt_conf_color_red_title": "Czerwony",
"edt_conf_color_reducedPixelSetFactorFactor_expl": "Oceń tylko zestaw pikseli na zdefiniowany obszar LED, niski ~25%, średni ~10%, wysoki ~6%",
"edt_conf_color_reducedPixelSetFactorFactor_title": "Zredukowane przetwarzanie pikseli",
"edt_conf_color_saturationGain_expl": "Reguluje nasycenie kolorów. 1.0 oznacza brak zmian, powyżej 1.0 zwiększa nasycenie, poniżej 1.0 zmniejsza nasycenie.",
"edt_conf_color_saturationGain_title": "Wzmocnienie nasycenia",
"edt_conf_color_white_expl": "Skalibrowana wartość koloru białego.",
@ -316,6 +344,8 @@
"edt_conf_enum_color": "Kolor",
"edt_conf_enum_custom": "Odświeżanie",
"edt_conf_enum_decay": "Rozmycie",
"edt_conf_enum_delay": "Tylko zwłoka",
"edt_conf_enum_disabled": "Wyłączony",
"edt_conf_enum_dl_error": "Błąd",
"edt_conf_enum_dl_informational": "Informacyjny",
"edt_conf_enum_dl_nodebug": "Bez debugowania",
@ -324,9 +354,12 @@
"edt_conf_enum_dl_verbose1": "Poziom szczegółowości 1",
"edt_conf_enum_dl_verbose2": "Poziom szczegółowości 2",
"edt_conf_enum_dl_verbose3": "Poziom szczegółowości 3",
"edt_conf_enum_dominant_color": "Kolor dominujący — na diodę LED",
"edt_conf_enum_dominant_color_advanced": "Zaawansowany kolor dominujący — na diodę LED",
"edt_conf_enum_effect": "Efekt",
"edt_conf_enum_gbr": "GBR",
"edt_conf_enum_grb": "GRB",
"edt_conf_enum_high": "Wysoki",
"edt_conf_enum_hsv": "HSV",
"edt_conf_enum_left_right": "Z lewej na prawą",
"edt_conf_enum_linear": "Linearny",
@ -334,6 +367,8 @@
"edt_conf_enum_logsilent": "Cichy",
"edt_conf_enum_logverbose": "Gadatliwy",
"edt_conf_enum_logwarn": "Ostrzeżenie",
"edt_conf_enum_low": "Niski",
"edt_conf_enum_medium": "Średni",
"edt_conf_enum_multicolor_mean": "Kolorowy",
"edt_conf_enum_please_select": "Proszę wybrać",
"edt_conf_enum_rbg": "RBG",
@ -403,6 +438,8 @@
"edt_conf_grabber_discovered_title": "Wykryte urządzenia",
"edt_conf_grabber_discovered_title_info": "Wybierz wykryte urządzenie do przechwytywania",
"edt_conf_grabber_discovery_inprogress": "Wykrywanie w toku",
"edt_conf_instC_audioEnable_expl": "Włącza przechwytywanie dźwięku dla tej instancji sprzętu LED",
"edt_conf_instC_audioEnable_title": "Włącz przechwytywanie dźwięku",
"edt_conf_instC_screen_grabber_device_expl": "Używane urządzenie do przechwytywania ekranu",
"edt_conf_instC_screen_grabber_device_title": "Urządzenie do przechwytywania ekranu",
"edt_conf_instC_systemEnable_expl": "Umożliwia przechwytywanie pulpitu urządzenia na którym zainstalowany jest Hyperion.",
@ -520,8 +557,6 @@
"edt_conf_webc_keyPath_title": "Ścieżka klucza prywatnego",
"edt_conf_webc_sslport_expl": "Port serwera internetowego HTTPS",
"edt_conf_webc_sslport_title": "Port HTTPS",
"edt_dev_auth_key_title": "Token uwierzytelnienia",
"edt_dev_auth_key_title_info": "Aby uzyskać dostęp do urządzenia, wymagany jest token uwierzytelniający",
"edt_dev_enum_sub_min_cool_adjust": "Odejmij zimną biel",
"edt_dev_enum_sub_min_warm_adjust": "Odejmij ciepłą biel",
"edt_dev_enum_subtract_minimum": "Odejmij minimum",
@ -574,7 +609,6 @@
"edt_dev_spec_gpioBcm_title": "Pin GPIO",
"edt_dev_spec_gpioMap_title": "Mapowanie GPIO",
"edt_dev_spec_gpioNumber_title": "Numer GPIO",
"edt_dev_spec_groupId_title": "Identyfikator grupy",
"edt_dev_spec_header_title": "Ustawienia dodatkowe",
"edt_dev_spec_interpolation_title": "Interpolacja",
"edt_dev_spec_intervall_title": "Przedział",
@ -615,6 +649,10 @@
"edt_dev_spec_rgbw_calibration_green": "Wygląd kanału zielonego/białego",
"edt_dev_spec_rgbw_calibration_limit": "Limit kanału białego",
"edt_dev_spec_rgbw_calibration_red": "Wygląd kanału czerwonego/białego",
"edt_dev_spec_segmentId_title": "Segment-ID",
"edt_dev_spec_segmentsSwitchOffOthers_title": "Wyłącz inne segmenty",
"edt_dev_spec_segments_disabled_title": "Transmisja segmentów wyłączona w WLED.",
"edt_dev_spec_segments_title": "Przesyłaj strumieniowo do segmentu",
"edt_dev_spec_serial_title": "Numer seryjny",
"edt_dev_spec_spipath_title": "SPI path",
"edt_dev_spec_sslHSTimeoutMax_title": "Maksymalny limit czasu uzgadniania streamera",
@ -842,6 +880,7 @@
"general_col_blue": "niebieski",
"general_col_green": "zielony",
"general_col_red": "czerwony",
"general_comp_AUDIO": "Przechwytywanie dźwięku",
"general_comp_BLACKBORDER": "Usuń czarne pasy",
"general_comp_BOBLIGHTSERVER": "Serwer Boblight",
"general_comp_FLATBUFSERVER": "Serwer FlatBuffers",
@ -965,6 +1004,8 @@
"remote_losthint": "Uwaga: wszystkie zmiany zostaną utracone po ponownym uruchomieniu.",
"remote_maptype_intro": "Zwykle układ diody jest odpowiedzialny za ustawienie rodzaju obrazu wyświetlanego na diodach, możesz to tutaj zmienić. $1.",
"remote_maptype_label": "Rodzaj mapowania",
"remote_maptype_label_dominant_color": "Dominujący kolor",
"remote_maptype_label_dominant_color_advanced": "Kolor dominujący Zaawansowany",
"remote_maptype_label_multicolor_mean": "Kolorowy",
"remote_maptype_label_unicolor_mean": "Mieszaj kolory do jednego koloru",
"remote_optgroup_syseffets": "Efekty standardowe",
@ -1037,7 +1078,6 @@
"wiz_cololight_noprops": "Nie można pobrać konfiguracji urządzenia - ręcznie zdefiniuj liczbę diod LED sprzętu",
"wiz_cololight_title": "Kreator Cololight",
"wiz_guideyou": "$1 poprowadzi Cię przez konfigurację. Wystarczy nacisnąć przycisk!",
"wiz_hue_blinkblue": "ID $1 świeci na niebiesko",
"wiz_hue_clientkey": "Klucz klienta:",
"wiz_hue_create_user": "Utwórz nowego Użytkownika",
"wiz_hue_desc1": "Automatycznie wyszukuje Hue Bridge, na wypadek, gdyby nie mógł go znaleźć, musisz podać adres IP i nacisnąć przycisk przeładowania po prawej stronie.",

View File

@ -83,6 +83,16 @@
"conf_leds_layout_cl_leftbottom": "Esquerda 50% - 100% Base",
"conf_leds_layout_cl_leftmiddle": "Esquerda 25% - 75% Meio",
"conf_leds_layout_cl_lefttop": "Esquerda 0% - 50% Topo",
"conf_leds_layout_cl_lightPosBottomLeft11": "Inferior: 75 - 100% da esquerda",
"conf_leds_layout_cl_lightPosBottomLeft112": "Inferior: 0 - 50% da esquerda",
"conf_leds_layout_cl_lightPosBottomLeft12": "Inferior: 25 - 50% da esquerda",
"conf_leds_layout_cl_lightPosBottomLeft121": "Inferior: 50 - 100% da esquerda",
"conf_leds_layout_cl_lightPosBottomLeft14": "Inferior: 0 - 25% da esquerda",
"conf_leds_layout_cl_lightPosBottomLeft34": "Inferior: 50- 75% da esquerda",
"conf_leds_layout_cl_lightPosBottomLeftNewMid": "Inferior: 25 - 75% da esquerda",
"conf_leds_layout_cl_lightPosTopLeft112": "Superior: 0 - 50% da esquerda",
"conf_leds_layout_cl_lightPosTopLeft121": "Superior: 50 - 100% da esquerda",
"conf_leds_layout_cl_lightPosTopLeftNewMid": "Superior: 25 - 75% da esquerda",
"conf_leds_layout_cl_overlap": "Sobreposição",
"conf_leds_layout_cl_reversdir": "Inverter direção",
"conf_leds_layout_cl_right": "Direita",
@ -352,11 +362,17 @@
"edt_conf_fge_type_title": "Tipo",
"edt_conf_fw_flat_expl": "Um alvo flatbuffer por linha. Contém IP: PORTA (Exemplo: 127.0.0.1:19401)",
"edt_conf_fw_flat_itemtitle": "alvo flatbuffer",
"edt_conf_fw_flat_services_discovered_expl": "Servidores Hyperion descobertos fornecendo serviços flatbuffer",
"edt_conf_fw_flat_services_discovered_title": "Destinos flatbuffer descobertos",
"edt_conf_fw_flat_title": "Lista de alvos flatbuffer",
"edt_conf_fw_heading_title": "Despachante",
"edt_conf_fw_json_expl": "Um alvo json por linha. Contém IP: PORT (Exemplo: 127.0.0.1:19446)",
"edt_conf_fw_json_itemtitle": "Alvo Json",
"edt_conf_fw_json_services_discovered_expl": "Servidores Hyperion descobertos fornecendo serviços JSON-API",
"edt_conf_fw_json_services_discovered_title": "Destinos JSON descobertos",
"edt_conf_fw_json_title": "Lista de alvos json",
"edt_conf_fw_remote_service_discovered_none": "Nenhum serviço remoto descoberto",
"edt_conf_fw_service_name_expl": "Nome do provedor de serviços",
"edt_conf_gen_configVersion_title": "Versão de Configuração",
"edt_conf_gen_heading_title": "Configurações Gerais",
"edt_conf_gen_name_expl": "Um nome definido pelo usuário que é usado para detectar o Hyperion. (Útil com mais de uma instância do Hyperion)",
@ -415,8 +431,6 @@
"edt_conf_smooth_heading_title": "Suavização",
"edt_conf_smooth_interpolationRate_expl": "Velocidade do cálculo de quadros intermediários suavizados.",
"edt_conf_smooth_interpolationRate_title": "Taxa de interpolação",
"edt_conf_smooth_outputRate_expl": "A velocidade de saída para o controlador led.",
"edt_conf_smooth_outputRate_title": "Taxa de saída",
"edt_conf_smooth_time_ms_expl": "Por quanto tempo a suavização deve reunir imagens?",
"edt_conf_smooth_time_ms_title": "Tempo",
"edt_conf_smooth_type_expl": "Tipo de Suavização.",
@ -495,8 +509,6 @@
"edt_conf_webc_keyPath_title": "Caminho da chave privada",
"edt_conf_webc_sslport_expl": "Porta do HTTPS-Webservidor",
"edt_conf_webc_sslport_title": "Porta HTTPS",
"edt_dev_auth_key_title": "Token de autenticação",
"edt_dev_auth_key_title_info": "Token de autenticação necessário para acessar o dispositivo",
"edt_dev_enum_sub_min_cool_adjust": "Subtrair branco frio",
"edt_dev_enum_sub_min_warm_adjust": "Subtrair o branco quente",
"edt_dev_enum_subtract_minimum": "Subtrair mínimo",
@ -540,7 +552,7 @@
"edt_dev_spec_gpioBcm_title": "Pino GPIO",
"edt_dev_spec_gpioMap_title": "Mapeamento GPIO",
"edt_dev_spec_gpioNumber_title": "Número GPIO",
"edt_dev_spec_groupId_title": "ID do Grupo",
"edt_dev_spec_groupId_title": "Grupo",
"edt_dev_spec_header_title": "Configurações Específicas",
"edt_dev_spec_interpolation_title": "Interpolação",
"edt_dev_spec_intervall_title": "Intervalo",
@ -826,6 +838,7 @@
"general_speech_fr": "Francês",
"general_speech_hu": "Hungáro",
"general_speech_it": "Italiano",
"general_speech_ja": "Japonês",
"general_speech_nb": "Norueguês (Bokmål)",
"general_speech_nl": "Holandês",
"general_speech_pl": "Polonês",
@ -990,7 +1003,6 @@
"wiz_cololight_noprops": "Não é possível obter propriedades do dispositivo - Definir contagem de LED de hardware manualmente",
"wiz_cololight_title": "Assistente Cololight",
"wiz_guideyou": "O $1 irá guiá-lo através das configurações. Basta apertar o botão!",
"wiz_hue_blinkblue": "Deixe ID $1 acender em azul",
"wiz_hue_clientkey": "Chave do Cliente:",
"wiz_hue_create_user": "Criar novo Usuário",
"wiz_hue_desc1": "Ele procura automaticamente por um Hue-Bridge, caso não encontre um, você precisa fornecer o endereço IP e apertar o botão recarregar à direita. Agora você precisa de um ID de usuário, se você não tiver um, crie um novo.",

View File

@ -58,7 +58,9 @@
"conf_leds_error_get_properties_title": "Настройки устройства",
"conf_leds_error_hwled_gt_layout": "Количество светодиодов оборудования ($1) больше, чем количество светодиодов, настроенных с помощью макета ($2), <br> $3 {{plural:$3|Светодиод|Светодиоды}} останутся черными, если вы продолжите.",
"conf_leds_error_hwled_gt_maxled": "Количество светодиодов оборудования ($1) превышает максимальное количество светодиодов, поддерживаемое устройством ($2). <br> Счетчик аппаратных светодиодов установлен на ($3).",
"conf_leds_error_hwled_gt_maxled_protocol": "Аппаратное количество светодиодов ($1) больше, чем максимальное количество светодиодов, поддерживаемое потоковым протоколом ($2). <br> Потоковый протокол будет изменен на ($3).",
"conf_leds_error_hwled_lt_layout": "Количество светодиодных индикаторов оборудования ($1) меньше, чем количество светодиодов, настроенных с помощью макета ($2). <br> Количество светодиодов, настроенных в макете, не должно превышать количество доступных светодиодов",
"conf_leds_error_wled_segment_missing": "Текущий настроенный сегмент ($1) не настроен на вашем WLED устройстве.<br>Возможно, вам необходимо проверить конфигурацию WLED!<br>Страница конфигурации представляет текущую настройку WLED.",
"conf_leds_info_ws281x": "Для данного типа контроллера Hyperion должен быть запущен с 'root' правами!",
"conf_leds_layout_advanced": "Расширенные Настройки",
"conf_leds_layout_blacklist_num_title": "Количество светодиодов",
@ -210,7 +212,7 @@
"dashboard_infobox_label_watchedversionbranch": "Смотрели ветку версий:",
"dashboard_infobox_message_updatesuccess": "Вы используете актуальную версию Hyperion.",
"dashboard_infobox_message_updatewarning": "Новая версия Hyperion доступна! ($1)",
"dashboard_label_intro": "Панель инструментов позволяет быстро увидеть состояние Hyperion",
"dashboard_label_intro": "Панель инструментов даёт краткий обзор состояния Hyperion",
"dashboard_message_default_password": "В настоящее время для веб-интерфейса установлен пароль по умолчанию. Мы настоятельно рекомендуем это изменить.",
"dashboard_message_default_password_t": "Пароль WebUI по умолчанию установлен",
"dashboard_message_do_not_show_again": "Не показывать это сообщение снова",
@ -232,6 +234,11 @@
"edt_append_pixel": "Пиксель",
"edt_append_s": "сек",
"edt_append_sdegree": "с/градус",
"edt_conf_audio_device_expl": "Выбранное устройство ввода звука",
"edt_conf_audio_device_title": "Аудио устройство",
"edt_conf_audio_effect_set_defaults": "Сброс значений по умолчанию",
"edt_conf_audio_effects_title": "Аудио эффекты",
"edt_conf_audio_heading_title": "Захват звука",
"edt_conf_bb_blurRemoveCnt_expl": "Количество пикселей, которые удаляются с обнаруженной границы, чтобы убрать размытие.",
"edt_conf_bb_blurRemoveCnt_title": "Размытие пикселя",
"edt_conf_bb_borderFrameCnt_expl": "Количество кадров до установки согласованной обнаруженной границы.",
@ -247,6 +254,7 @@
"edt_conf_bb_unknownFrameCnt_title": "Неизвестные кадры",
"edt_conf_bge_heading_title": "Фоновый Эффект/Цвет",
"edt_conf_bobls_heading_title": "Сервер Boblight",
"edt_conf_color_accuracyLevel_title": "Уровень точности",
"edt_conf_color_backlightColored_expl": "Добавьте цвета вашей подсветке.",
"edt_conf_color_backlightColored_title": "Цветная подсветка",
"edt_conf_color_backlightThreshold_expl": "Минимальная яркость (подсветка). Отключено во время эффектов, цветов и в состоянии \"Выкл.\"",
@ -316,6 +324,8 @@
"edt_conf_enum_color": "Цвет",
"edt_conf_enum_custom": "Пользовательский",
"edt_conf_enum_decay": "Задержка",
"edt_conf_enum_delay": "Только задержка",
"edt_conf_enum_disabled": "Отключён",
"edt_conf_enum_dl_error": "Ошибка",
"edt_conf_enum_dl_informational": "Информационный",
"edt_conf_enum_dl_nodebug": "Нет вывода отладки",
@ -403,6 +413,7 @@
"edt_conf_grabber_discovered_title": "Обнаружено устройство",
"edt_conf_grabber_discovered_title_info": "Выберите обнаруженное устройство захвата",
"edt_conf_grabber_discovery_inprogress": "Открытие в процессе",
"edt_conf_instC_audioEnable_title": "Включить захват звука",
"edt_conf_instC_screen_grabber_device_expl": "Используемое устройство захвата экрана",
"edt_conf_instC_screen_grabber_device_title": "Устройство захвата экрана",
"edt_conf_instC_systemEnable_expl": "Включает захват экрана для этого экземпляра светодиодного оборудования",
@ -520,8 +531,6 @@
"edt_conf_webc_keyPath_title": "Путь к приватному ключу",
"edt_conf_webc_sslport_expl": "Порт HTTPS-веб-сервера",
"edt_conf_webc_sslport_title": "Порт HTTPS",
"edt_dev_auth_key_title": "Токен аудетицикафии",
"edt_dev_auth_key_title_info": "Токен аутентификации, необходимый для доступа к устройству",
"edt_dev_enum_sub_min_cool_adjust": "Уменьшить холодный белый",
"edt_dev_enum_sub_min_warm_adjust": "Уменьшить теплый белый",
"edt_dev_enum_subtract_minimum": "Уменьшить минимум",
@ -574,7 +583,6 @@
"edt_dev_spec_gpioBcm_title": "Вывод GPIO",
"edt_dev_spec_gpioMap_title": "Отображение GPIO",
"edt_dev_spec_gpioNumber_title": "Номер GPIO",
"edt_dev_spec_groupId_title": "ID группы",
"edt_dev_spec_header_title": "Особые настройки",
"edt_dev_spec_interpolation_title": "Интерполяция",
"edt_dev_spec_intervall_title": "Интервал",
@ -615,6 +623,8 @@
"edt_dev_spec_rgbw_calibration_green": "Соотношение Зеленого/Белого каналов",
"edt_dev_spec_rgbw_calibration_limit": "Ограничение белого",
"edt_dev_spec_rgbw_calibration_red": "Соотношение Красного/Белого каналов",
"edt_dev_spec_segmentId_title": "ID сегмента",
"edt_dev_spec_segments_disabled_title": "Стриминг сегментов отключён на WLED.",
"edt_dev_spec_serial_title": "Серийный номер",
"edt_dev_spec_spipath_title": "Устройство SPI",
"edt_dev_spec_sslHSTimeoutMax_title": "Максимальное время ожидания подтверждения стримером",
@ -842,6 +852,7 @@
"general_col_blue": "синий",
"general_col_green": "зеленый",
"general_col_red": "красный",
"general_comp_AUDIO": "Захват звука",
"general_comp_BLACKBORDER": "Определение черных полос",
"general_comp_BOBLIGHTSERVER": "Boblight cервер",
"general_comp_FLATBUFSERVER": "Flatbuffers сервер",
@ -850,7 +861,7 @@
"general_comp_LEDDEVICE": "Светодиодное устройство (LED)",
"general_comp_PROTOSERVER": "Protocol Buffers сервер",
"general_comp_SMOOTHING": "Сглаживание",
"general_comp_V4L": "USB захват",
"general_comp_V4L": "Захват USB",
"general_country_cn": "Китай",
"general_country_de": "Германия",
"general_country_es": "Испания",
@ -1037,7 +1048,6 @@
"wiz_cololight_noprops": "Не удалось получить свойства устройства — определить количество светодиодных индикаторов оборудования вручную",
"wiz_cololight_title": "Мастер Cololight",
"wiz_guideyou": "$1 проведет вас через настройки. Просто нажмите кнопку!",
"wiz_hue_blinkblue": "Пусть ID $1 загорится синим",
"wiz_hue_clientkey": "Клиентский ключ",
"wiz_hue_create_user": "Создать нового пользователя",
"wiz_hue_desc1": "Он автоматически ищет Hue-Bridge, если он не может найти его, вам нужно указать IP-адрес и нажать кнопку перезагрузки справа. Теперь вам нужен идентификатор пользователя, если у вас его нет, создайте новый.",

View File

@ -22,6 +22,8 @@
"about_resources": "$1 bibliotek",
"about_translations": "Översättningar",
"about_version": "Version",
"conf_cec_events_heading_title": "CEC-händelser",
"conf_cec_events_intro": "Inställningar relaterade till olika CEC (Consumer Electronics Control) protokollhändelser som Hyperion kan hantera.",
"conf_colors_blackborder_intro": "Ignorera svarta staplar, varje läge använder en annan algoritm för att upptäcka dem. Höj tröskeln om det inte fungerar.",
"conf_colors_color_intro": "Skapa en eller flera kalibreringsprofiler, justera varje färg, ljusstyrka, linjärisering med mera.",
"conf_colors_smoothing_intro": "Jämna ut gradienter och ljusstyrkaförändringar så att du inte blir distraherad av snabba övergångar.",
@ -44,6 +46,7 @@
"conf_general_inst_title": "LED-hårdvaruinstanshantering",
"conf_general_intro": "Grundläggande Hyperion- eller WebUI-inställningar som inte passar in i någon annan kategori.",
"conf_general_label_title": "Allmänna inställningar",
"conf_grabber_audio_intro": "Ljudinspelning använder en ljudingångsenhet som källa för visualisering.",
"conf_grabber_fg_intro": "Skärmupptagning är det lokala systemet där Hyperion är installerat, som fungerar som bildkälla.",
"conf_grabber_inst_grabber_config_info": "Konfigurera dina upptagningssenheter innan du använder dem i en LED-instans.",
"conf_grabber_v4l_intro": "USB-upptagning är en enhet som är ansluten via USB och fungerar som en bildkälla.",
@ -52,7 +55,7 @@
"conf_leds_config_error": "Fel i LED/LED-layoutkonfigurationen",
"conf_leds_config_warning": "Kontrollera LED/LED-layoutkonfigurationen",
"conf_leds_contr_label_contrtype": "Kontrolltyp:",
"conf_leds_device_info_log": "Om lysdioderna inte tänds, kontrollera här om det var ett fel:",
"conf_leds_device_info_log": "Om dina LED-lampor inte fungerar, kontrollera här efter felmeddelanden:",
"conf_leds_device_intro": "Välj en metod för att styra dina lysdioder, de är indelade i olika kategorier. Utöver de allmänna alternativen som gäller för alla, finns det även specifika som skiljer sig beroende på valet.",
"conf_leds_error_get_properties_text": "Kan inte komma åt enhetsegenskaper - Kontrollera konfigurationen.",
"conf_leds_error_get_properties_title": "Enhetsegenskaper",
@ -75,12 +78,14 @@
"conf_leds_layout_checkp1": "Den svartfärgade lysdioden är den första lysdioden. Detta är den punkt där data matas.",
"conf_leds_layout_checkp2": "Layouten är utsikten från att stå framför TV:n, inte bakom den.",
"conf_leds_layout_checkp3": "Se till att riktningen är korrekt inställd, den andra och tredje lysdioden är markerade med grått för att visa dataflödet.",
"conf_leds_layout_checkp4": "Processgap: Om du behöver ett gap, ignorera det när du anger LED topp/botten/höger/vänster och skriv sedan in under gap length hur många lysdioder du vill ta bort. Ändra nu mellanrummet för att placera mellanrummet på rätt plats.",
"conf_leds_layout_cl_bottom": "Under",
"conf_leds_layout_cl_bottomleft": "Nedre vänstra hörnet",
"conf_leds_layout_cl_bottomright": "Nedre högra hörnet",
"conf_leds_layout_checkp4": "Fallmellanrum: För att skapa ett mellanrum, ignorera det först när du definierar Övre/Nedre/Vänster/Höger och ställ sedan in din mellanrums längd för att ta bort ett antal LED-lampor. Modifiera mellanrumspositionen tills den matchar.",
"conf_leds_layout_cl_bottom": "Nedre",
"conf_leds_layout_cl_bottomleft": "Nedre vänster (hörn)",
"conf_leds_layout_cl_bottomright": "Nedre höger (hörn)",
"conf_leds_layout_cl_cornergap": "Hörnavstånd",
"conf_leds_layout_cl_edgegap": "Ramavstånd",
"conf_leds_layout_cl_entertainment": "Underhållningsområde",
"conf_leds_layout_cl_entertainment_center": "Underhållningsområdets central",
"conf_leds_layout_cl_gaglength": "Spaltlängd",
"conf_leds_layout_cl_gappos": "Mellanrumsposition",
"conf_leds_layout_cl_hleddepth": "Horisontellt LED-djup",
@ -110,7 +115,13 @@
"conf_leds_layout_cl_topright": "Övre högra hörnet",
"conf_leds_layout_cl_vleddepth": "Vertikalt LED-djup",
"conf_leds_layout_frame": "Klassisk layout (ram)",
"conf_leds_layout_gapbottom": "Nedre mellanrum",
"conf_leds_layout_gapleft": "Vänster mellanrum",
"conf_leds_layout_gapright": "Höger mellanrum",
"conf_leds_layout_gaptop": "Övre mellanrum",
"conf_leds_layout_generatedconf": "Genererad/aktuell LED-konfiguration",
"conf_leds_layout_generation_error": "LED-layout genererades inte",
"conf_leds_layout_generation_success": "LED-layout genererad framgångsrikt",
"conf_leds_layout_intro": "Du behöver också en LED-layout som återspeglar dina LED-positioner. Den klassiska layouten används ofta för TV-apparater, men Hyperion stöder även LED-väggar (matrix). Utsikten över layouten är perspektivet FRAMFÖR TV:n, inte bakom den.",
"conf_leds_layout_ma_cabling": "kablage",
"conf_leds_layout_ma_direction": "Riktning",
@ -167,28 +178,33 @@
"conf_logging_uplpolicy": "Du accepterar härmed",
"conf_logging_yourlink": "Länk till din rapport",
"conf_network_bobl_intro": "Boblight-mottagare",
"conf_network_createToken_btn": "Skapa token",
"conf_network_createToken_btn": "Skapa nyckel",
"conf_network_fbs_intro": "Google Flatbuffers-mottagare. Används för snabb bildmottagning.",
"conf_network_forw_intro": "Vidarebefordra allt till en andra Hyperion-installation, som sedan kan användas med en annan LED-kontroller",
"conf_network_json_intro": "JSON-RPC-porten för alla Hyperion-instanser, som används för fjärrkontroll.",
"conf_network_net_intro": "Nätverksinställningar som gäller för alla nätverkstjänster",
"conf_network_proto_intro": "PROTO-porten för alla Hyperion-instanser används för \"bildströmmar\" (HyperionScreenCap, Kodi-tillägg, Android Hyperion Grabber, ...)",
"conf_network_proto_intro": "PROTO-porten för alla Hyperion-instanser, används för bildströmmar (HyperionScreenCap, Kodi Tillägg, Android Hyperion-insamlare, ...)",
"conf_network_tok_cidhead": "Beskrivning",
"conf_network_tok_comment_title": "Tokenbeskrivning",
"conf_network_tok_desc": "Tokens tillåter andra applikationer att komma åt Hyperion API. En ansökan kan begära en token, som du måste bekräfta, eller så kan du skapa en ny token själv. Dessa tokens krävs endast om \"API-auktorisering\" är aktiverat i nätverksinställningarna.",
"conf_network_tok_diaMsg": "Här är din nya token som kan användas för att komma åt Hyperion API. Av säkerhetsskäl kan tokens bara ses en gång efter att de skapats, så notera det nu.",
"conf_network_tok_diaTitle": "Ny token skapad!",
"conf_network_tok_grantMsg": "En app begär åtkomst till Hyperion API via en token. Vill du tillåta detta? Vänligen kontrollera informationen!",
"conf_network_tok_grantT": "App-token begärd",
"conf_network_tok_intro": "Här kan du skapa eller ta bort tokens för API-autentisering. Nyskapade tokens visas en gång.",
"conf_network_tok_comment_title": "Nyckelbeskrivning",
"conf_network_tok_desc": "Nycklar tillåter andra applikationer att komma åt Hyperion API. En ansökan kan begära en nyckel, som du måste bekräfta, eller så kan du skapa en ny nyckel själv. Dessa nycklar krävs endast om \"API-auktorisering\" är aktiverat i nätverksinställningarna.",
"conf_network_tok_diaMsg": "Här är din nya nyckel som kan användas för att komma åt Hyperion API. Av säkerhetsskäl kan nycklar bara ses en gång efter att de skapats, så notera det nu.",
"conf_network_tok_diaTitle": "Ny nyckel skapad!",
"conf_network_tok_grantMsg": "En app begär åtkomst till Hyperion API via en nyckel. Vill du tillåta detta? Vänligen kontrollera informationen!",
"conf_network_tok_grantT": "App-nyckel begärd",
"conf_network_tok_idhead": "ID",
"conf_network_tok_intro": "Här kan du skapa eller ta bort nycklar för API-autentisering. Nyskapade nycklar visas en gång.",
"conf_network_tok_lastuse": "Senast använd",
"conf_network_tok_title": "Tokenhantering",
"conf_network_tok_title": "Nyckelhantering",
"conf_os_events_heading_title": "Operativsystemhändelser",
"conf_os_events_intro": "Inställningar relaterade till olika operativsystemhändelser som Hyperion kan hantera.",
"conf_sched_events_heading_title": "Planerade händelser",
"conf_sched_events_intro": "Inställningar relaterade till schemalagda, det vill säga tidsbaserade händelser, som Hyperion kommer att hantera.",
"conf_webconfig_label_intro": "Webbkonfigurationsinställningar. Ändringar kan påverka tillgängligheten för webbgränssnittet.",
"dashboard_active_instance": "Vald instans",
"dashboard_alert_message_confedit": "Din Hyperion-konfiguration har ändrats. För att tillämpa ändringarna, starta om Hyperion.",
"dashboard_alert_message_confedit_t": "Konfigurationen har ändrats",
"dashboard_alert_message_confsave_success": "Din Hyperion-konfiguration har sparats utan problem. Dina ändringar är nu aktiva.",
"dashboard_alert_message_confsave_success_t": "konfigurationen sparad",
"dashboard_alert_message_confsave_success_t": "konfigurationen har sparats",
"dashboard_alert_message_disabled": "Denna instans är för närvarande inaktiverad! För att kunna använda den igen måste du först aktivera den i instrumentpanelen.",
"dashboard_alert_message_disabled_t": "LED-hårdvaruinstans inaktiverad",
"dashboard_componentbox_label_comp": "Komponenter",
@ -234,6 +250,30 @@
"edt_append_pixel": "Pixel",
"edt_append_s": "s",
"edt_append_sdegree": "s/grad",
"edt_conf_action_expl": "Åtgärd att tillämpas",
"edt_conf_action_record_validation_error": "Samma händelse kan bara utlösa en åtgärd. Rensa upp åtgärder $1",
"edt_conf_action_title": "Åtgärd",
"edt_conf_audio_device_expl": "Vald ljudingångsenhet",
"edt_conf_audio_device_title": "Ljudenhet",
"edt_conf_audio_effect_enum_vumeter": "VU-Mätare",
"edt_conf_audio_effect_hotcolor_expl": "Varm Färg",
"edt_conf_audio_effect_hotcolor_title": "Varm Färg",
"edt_conf_audio_effect_multiplier_expl": "Multiplikator för ljudsignalvärde",
"edt_conf_audio_effect_multiplier_title": "Multiplikator",
"edt_conf_audio_effect_safecolor_expl": "Säker Färg",
"edt_conf_audio_effect_safecolor_title": "Säker Färg",
"edt_conf_audio_effect_safevalue_expl": "Säker Tröskel",
"edt_conf_audio_effect_safevalue_title": "Säker Tröskel",
"edt_conf_audio_effect_set_defaults": "Återställ till standardvärden",
"edt_conf_audio_effect_tolerance_expl": "Tolerans som används vid automatisk beräkning av en signalmultiplikator från 0-100",
"edt_conf_audio_effect_tolerance_title": "Tolerans",
"edt_conf_audio_effect_warncolor_expl": "Varningsfärg",
"edt_conf_audio_effect_warncolor_title": "Varningsfärg",
"edt_conf_audio_effect_warnvalue_expl": "Varningströskel",
"edt_conf_audio_effect_warnvalue_title": "Varningströskel",
"edt_conf_audio_effects_expl": "Välj en effekt på hur ljudsignalen omvandlas till",
"edt_conf_audio_effects_title": "Ljudeffekter",
"edt_conf_audio_heading_title": "Ljudupptagning",
"edt_conf_bb_blurRemoveCnt_expl": "Antal pixlar som dessutom beskärs från kanten.",
"edt_conf_bb_blurRemoveCnt_title": "Suddiga pixlar",
"edt_conf_bb_borderFrameCnt_expl": "Antal bildrutor innan en ny ram ställs in.",
@ -249,6 +289,19 @@
"edt_conf_bb_unknownFrameCnt_title": "Okända bilder",
"edt_conf_bge_heading_title": "Bakgrundseffekt/färg",
"edt_conf_bobls_heading_title": "Boblight-server",
"edt_conf_cec_actions_header_expl": "Definiera vilken åtgärd som ska utföras vid en igenkänd CEC-händelse.",
"edt_conf_cec_actions_header_item_title": "Åtgärd",
"edt_conf_cec_actions_header_title": "Åtgärder",
"edt_conf_cec_button_release_delay_ms_expl": "Fjärrknapptryckning släpptid",
"edt_conf_cec_button_release_delay_ms_title": "Knappsläpptid",
"edt_conf_cec_button_repeat_rate_ms_expl": "Fjärrknapptryck upprepningstakt",
"edt_conf_cec_button_repeat_rate_ms_title": "Knappupprepningstakt",
"edt_conf_cec_double_tap_timeout_ms_expl": "Fjärrknapptryck fördröjning före upprepning",
"edt_conf_cec_double_tap_timeout_ms_title": "Fördröjning före knappupprepning",
"edt_conf_cec_event_expl": "CEC-händelse som kommer att utlösa en åtgärd",
"edt_conf_cec_event_title": "CEC-händelse",
"edt_conf_color_accuracyLevel_expl": "Nivå hur exakta dominerande färger utvärderas. En högre nivå skapar mer exakta resultat, men kräver också mer processorkraft. Bör kombineras med reducerad pixelbehandling.",
"edt_conf_color_accuracyLevel_title": "Noggrannhetsnivå",
"edt_conf_color_backlightColored_expl": "Bakgrundsbelysningen kan användas med eller utan färgkomponenter.",
"edt_conf_color_backlightColored_title": "Färgad bakgrundsbelysning",
"edt_conf_color_backlightThreshold_expl": "En lampa som är permanent aktiv. (Automatiskt inaktiverad på effekter, färger eller i läget \"avstängt\")",
@ -287,6 +340,8 @@
"edt_conf_color_magenta_title": "Magenta",
"edt_conf_color_red_expl": "Kalibrerat rött värde.",
"edt_conf_color_red_title": "Röd",
"edt_conf_color_reducedPixelSetFactorFactor_expl": "Utvärdera endast en uppsättning pixlar per definierat LED-område, Låg ~25%, Medium ~10%, Hög ~6%",
"edt_conf_color_reducedPixelSetFactorFactor_title": "Minskad pixelbehandling",
"edt_conf_color_saturationGain_expl": "Justera färgernas mättnad. 1,0 betyder ingen förändring, mer än 1,0 ökar mättnaden, mindre än 1,0 minskar mättnaden.",
"edt_conf_color_saturationGain_title": "Förstärkning av mättnaden",
"edt_conf_color_white_expl": "Kalibrerat vitt värde.",
@ -307,6 +362,13 @@
"edt_conf_enum_PAL": "PAL",
"edt_conf_enum_SECAM": "SECAM",
"edt_conf_enum_VERTICAL": "Vertikal",
"edt_conf_enum_action_idle": "Vänteläge",
"edt_conf_enum_action_restart": "Starta om",
"edt_conf_enum_action_resume": "Återuppta",
"edt_conf_enum_action_resumeIdle": "Återuppta vänteläge",
"edt_conf_enum_action_suspend": "Stäng av",
"edt_conf_enum_action_toggleIdle": "Växla vänteläge",
"edt_conf_enum_action_toggleSuspend": "Växla upphävning",
"edt_conf_enum_automatic": "Automatisk",
"edt_conf_enum_bbclassic": "Klassisk",
"edt_conf_enum_bbdefault": "Standard",
@ -315,9 +377,17 @@
"edt_conf_enum_bgr": "BGR",
"edt_conf_enum_bottom_up": "Nerifrån och upp",
"edt_conf_enum_brg": "BRG",
"edt_conf_enum_cec_key_f1_blue": "Blå knapp tryckt",
"edt_conf_enum_cec_key_f2_red": "Röd knapp tryckt",
"edt_conf_enum_cec_key_f3_green": "Grön knapp tryckt",
"edt_conf_enum_cec_key_f4_yellow": "Gul knapp tryckt",
"edt_conf_enum_cec_opcode_set stream path": "TV på",
"edt_conf_enum_cec_opcode_standby": "TV av",
"edt_conf_enum_color": "Färg",
"edt_conf_enum_custom": "Anpassad",
"edt_conf_enum_decay": "Dämpning",
"edt_conf_enum_delay": "Endast försening",
"edt_conf_enum_disabled": "Inaktiverad",
"edt_conf_enum_dl_error": "Bara fel",
"edt_conf_enum_dl_informational": "Informativ",
"edt_conf_enum_dl_nodebug": "Ingen felsökningsutgång",
@ -326,9 +396,12 @@
"edt_conf_enum_dl_verbose1": "Nivå 1",
"edt_conf_enum_dl_verbose2": "Nivå 2",
"edt_conf_enum_dl_verbose3": "Nivå 3",
"edt_conf_enum_dominant_color": "Dominant Färg - per LED",
"edt_conf_enum_dominant_color_advanced": "Dominant Färg Avancerad - per LED",
"edt_conf_enum_effect": "Effekt",
"edt_conf_enum_gbr": "GBR",
"edt_conf_enum_grb": "GRB",
"edt_conf_enum_high": "Hög",
"edt_conf_enum_hsv": "HSV",
"edt_conf_enum_left_right": "Från vänster till höger",
"edt_conf_enum_linear": "Linjär",
@ -336,7 +409,10 @@
"edt_conf_enum_logsilent": "Tyst",
"edt_conf_enum_logverbose": "Detaljerad",
"edt_conf_enum_logwarn": "Varning",
"edt_conf_enum_low": "Låg",
"edt_conf_enum_medium": "Medium",
"edt_conf_enum_multicolor_mean": "Flerfärgad",
"edt_conf_enum_multicolor_mean_squared": "Medelfärg i kvadrat - per lysdiod",
"edt_conf_enum_please_select": "Vänligen välj",
"edt_conf_enum_rbg": "RBG",
"edt_conf_enum_rgb": "RGB",
@ -405,6 +481,8 @@
"edt_conf_grabber_discovered_title": "Upptäckt upptagningssenhet",
"edt_conf_grabber_discovered_title_info": "Välj din upptagningsenhet som upptäckts",
"edt_conf_grabber_discovery_inprogress": "Hitta upptagningsenheter",
"edt_conf_instC_audioEnable_expl": "Aktiverar ljudinsamling för denna LED-hårdvaruinstans",
"edt_conf_instC_audioEnable_title": "Aktivera ljudinsamling",
"edt_conf_instC_screen_grabber_device_expl": "Skärmupptagningsenhet som används",
"edt_conf_instC_screen_grabber_device_title": "Skärmupptagningsenhet",
"edt_conf_instC_systemEnable_expl": "Aktiverar skärmupptagning för denna LED-hårdvaruinstans.",
@ -419,22 +497,28 @@
"edt_conf_log_level_expl": "Beroende på nivå är färre eller fler meddelanden synliga.",
"edt_conf_log_level_title": "Loggnivå",
"edt_conf_net_apiAuth_expl": "Tvinga alla applikationer som använder Hyperion API att autentisera sig själva. Aktivera för högre säkerhet, eftersom varje ny ansökan nu måste bekräftas av dig en gång.",
"edt_conf_net_apiAuth_title": "API-autentisering",
"edt_conf_net_heading_title": "Nätverk",
"edt_conf_net_internetAccessAPI_expl": "Tillåt åtkomst till Hyperion API/webbgränssnitt över Internet. Inaktivera åtkomst för ökad säkerhet.",
"edt_conf_net_internetAccessAPI_title": "Internet API-åtkomst",
"edt_conf_net_ipWhitelist_expl": "Istället för att tillåta åtkomst för alla anslutningar från internet kan du lägga till undantag för tillåtna IP-adresser här.",
"edt_conf_net_ipWhitelist_title": "Tillåtna IP-adresser",
"edt_conf_net_ip_itemtitle": "IP",
"edt_conf_net_localAdminAuth_expl": "Om den är aktiverad måste administrationsåtkomst från hemnätverket autentiseras med ett lösenord.",
"edt_conf_net_localAdminAuth_title": "Lokal administratörsautentisering",
"edt_conf_net_localApiAuth_expl": "Om den är aktiverad måste anslutningar från hemnätverket autentiseras med en token.",
"edt_conf_net_localApiAuth_expl": "Om den är aktiverad måste anslutningar från hemnätverket autentiseras med en nyckel.",
"edt_conf_net_localApiAuth_title": "Lokal API-autentisering",
"edt_conf_net_restirctedInternetAccessAPI_expl": "Begränsa åtkomsten till API:t över internet till specifika IP-adresser",
"edt_conf_net_restirctedInternetAccessAPI_title": "Begränsning till IP-adresser",
"edt_conf_os_events_lockEnable_expl": "Lyssna på skärmens lås/upplåsningshändelser",
"edt_conf_os_events_lockEnable_title": "Lyssna på låshändelser",
"edt_conf_os_events_suspendEnable_expl": "Lyssna på operativsystemets upphävnings/återupptagningshändelser",
"edt_conf_os_events_suspendEnable_title": "Lyssna på upphävningshändelser",
"edt_conf_os_events_suspendOnLockEnable_expl": "Upphäv när skärmen är låst, annars gå in i vänteläge",
"edt_conf_os_events_suspendOnLockEnable_title": "Upphäv vid låsning",
"edt_conf_pbs_heading_title": "Protocol Buffers-Server",
"edt_conf_pbs_timeout_expl": "Om ingen data tas emot under den angivna tiden är komponenten (tillfälligt) inaktiverad",
"edt_conf_pbs_timeout_title": "Timeout",
"edt_conf_sched_actions_header_expl": "Definiera vilken åtgärd som ska utföras vid en tidpunkt. Åtgärden kommer att schemaläggas dagligen.",
"edt_conf_sched_actions_header_item_title": "Åtgärd",
"edt_conf_sched_actions_header_title": "Åtgärder",
"edt_conf_smooth_continuousOutput_expl": "Uppdatera lysdioderna även om bilden inte har ändrats.",
"edt_conf_smooth_continuousOutput_title": "Kontinuerlig utgång",
"edt_conf_smooth_decay_expl": "Dämpningsgrad. linjär dämpning = 1; Värden större än ett har en starkare effekt.",
@ -452,12 +536,14 @@
"edt_conf_smooth_updateDelay_title": "Uppdateringsfördröjning",
"edt_conf_smooth_updateFrequency_expl": "Hastigheten för datautmatning till LED-styrenheten.",
"edt_conf_smooth_updateFrequency_title": "Uppdateringsfrekvens",
"edt_conf_time_event_expl": "Tidpunkt som kommer att utlösa en åtgärd",
"edt_conf_time_event_title": "Tid",
"edt_conf_v4l2_blueSignalThreshold_expl": "Ju högre blått värde, desto snabbare stängs den av med motsvarande blå komponent.",
"edt_conf_v4l2_blueSignalThreshold_title": "Blått tröskelvärde",
"edt_conf_v4l2_cecDetection_expl": "USB-insamling är tillfälligt inaktiverad när en CEC-standbysignal tas emot från HDMI-bussen.",
"edt_conf_v4l2_cecDetection_title": "CEC-detektering",
"edt_conf_v4l2_cropBottom_expl": "Antal pixlar på under som ska tas bort från bilden.",
"edt_conf_v4l2_cropBottom_title": "Beskär under",
"edt_conf_v4l2_cropBottom_title": "Beskär nedre",
"edt_conf_v4l2_cropHeightValidation_error": "Beskärningstopp + Beskärningsbotten kan inte vara större än höjd ($1)",
"edt_conf_v4l2_cropLeft_expl": "Antal pixlar till vänster som ska tas bort från bilden.",
"edt_conf_v4l2_cropLeft_title": "Beskär vänster",
@ -520,10 +606,12 @@
"edt_conf_webc_keyPassPhrase_title": "Nyckellösenord",
"edt_conf_webc_keyPath_expl": "Sökväg till privat nyckel (format i PEM, krypterad med RSA)",
"edt_conf_webc_keyPath_title": "Nyckelväg",
"edt_conf_webc_port_expl": "Port för WebServer, RPC och WebSocket HTTP-anslutningar",
"edt_conf_webc_port_title": "HTTP-port",
"edt_conf_webc_sslport_expl": "HTTPS-webbserverport",
"edt_conf_webc_sslport_title": "HTTPS-Port",
"edt_dev_auth_key_title": "Autentiserings-token",
"edt_dev_auth_key_title_info": "Autentiseringstoken för enheten",
"edt_dev_auth_key_title": "Auktorisationsnyckel",
"edt_dev_auth_key_title_info": "Auktorisationsnyckel krävs för att få åtkomst till enheten",
"edt_dev_enum_sub_min_cool_adjust": "Minsta justering: kall",
"edt_dev_enum_sub_min_warm_adjust": "Minsta justering: varm",
"edt_dev_enum_subtract_minimum": "Subtrahera minimum",
@ -536,7 +624,7 @@
"edt_dev_general_enableAttemptsInterval_title_info": "Intervall mellan två anslutningsförsök.",
"edt_dev_general_enableAttempts_title": "Anslutningsförsök",
"edt_dev_general_enableAttempts_title_info": "Antal anslutningsförsök innan enheten stannar.",
"edt_dev_general_hardwareLedCount_title": "Antal hårdvarulysdioder",
"edt_dev_general_hardwareLedCount_title": "Antal lysdioder",
"edt_dev_general_hardwareLedCount_title_info": "Enhetens tillgängliga LED-nummer",
"edt_dev_general_heading_title": "Allmänna inställningar",
"edt_dev_general_name_title": "Konfigurationsnamn",
@ -576,7 +664,7 @@
"edt_dev_spec_gpioBcm_title": "GPIO-stift",
"edt_dev_spec_gpioMap_title": "GPIO-tilldelning",
"edt_dev_spec_gpioNumber_title": "GPIO-nummer",
"edt_dev_spec_groupId_title": "Grupp-ID",
"edt_dev_spec_groupId_title": "Grupp",
"edt_dev_spec_header_title": "Specifika inställningar",
"edt_dev_spec_interpolation_title": "Interpolation",
"edt_dev_spec_intervall_title": "Intervall",
@ -623,7 +711,7 @@
"edt_dev_spec_segments_disabled_title": "Segmentströmning inaktiverad vid WLED.",
"edt_dev_spec_segments_title": "Streama till segment",
"edt_dev_spec_serial_title": "Serienummer",
"edt_dev_spec_spipath_title": "SPI Pfad",
"edt_dev_spec_spipath_title": "SPI-Enhet",
"edt_dev_spec_sslHSTimeoutMax_title": "Streamer handskakning maximal timeout",
"edt_dev_spec_sslHSTimeoutMin_title": "Minsta timeout för Streamerhandslag",
"edt_dev_spec_stayOnAfterStreaming_title": "Förbli på efter streaming",
@ -641,6 +729,7 @@
"edt_dev_spec_transistionTime_title": "Övergångstid",
"edt_dev_spec_uid_title": "UID",
"edt_dev_spec_universe_title": "Universal",
"edt_dev_spec_useAPIv2_title": "Använd API v2",
"edt_dev_spec_useEntertainmentAPI_title": "Använd Hue Entertainment API",
"edt_dev_spec_useOrbSmoothing_title": "Sfärisk utjämning",
"edt_dev_spec_useRgbwProtocol_title": "Använd RGBW-protokoll",
@ -712,6 +801,8 @@
"edt_eff_ledlist": "LED-lista",
"edt_eff_ledtest_header": "LED-test",
"edt_eff_ledtest_header_desc": "Roterande utdata av rött, grönt, blått, vitt och svart",
"edt_eff_ledtest_seq_header": "LED-test - Sekvens",
"edt_eff_ledtest_seq_header_desc": "Tänd LED-lamporna i sekvens",
"edt_eff_length": "Längd",
"edt_eff_lightclock_header": "Ljusklocka",
"edt_eff_lightclock_header_desc": "En riktig klocka som ljus! Justera färgerna på timmar, minuter, sekunder efter eget tycke. Valfritt kan markeringar för klockan 3/6/9/12 aktiveras. Om klockan visar en felaktig tid, kontrollera systemets tid.",
@ -761,7 +852,7 @@
"edt_eff_traces_header": "Färgspår",
"edt_eff_traces_header_desc": "Kräver en ny design",
"edt_eff_trails_header": "Stjärnfall",
"edt_eff_trails_header_desc": "I olika färger, gör en önskan!",
"edt_eff_trails_header_desc": "Färgade stjärnor som faller från toppen till botten.",
"edt_eff_url": "Bildadress",
"edt_eff_waves_header": "Vågor",
"edt_eff_waves_header_desc": "Skapa vågor av färg! Blanda dina favoritfärger och välj en mittpunkt.",
@ -851,6 +942,7 @@
"general_col_blue": "blå",
"general_col_green": "grön",
"general_col_red": "röd",
"general_comp_AUDIO": "Ljudupptagning",
"general_comp_BLACKBORDER": "Svart stapeldetektering",
"general_comp_BOBLIGHTSERVER": "Boblight-Server",
"general_comp_FLATBUFSERVER": "Flatbuffers-Server",
@ -879,7 +971,9 @@
"general_speech_en": "Engelska",
"general_speech_es": "Spanska",
"general_speech_fr": "Franska",
"general_speech_he": "Hebreiska",
"general_speech_hu": "Ungerska",
"general_speech_id": "Indonesiska",
"general_speech_it": "Italienska",
"general_speech_ja": "Japanska",
"general_speech_nb": "Norska (Bokmål)",
@ -890,6 +984,7 @@
"general_speech_ru": "Ryska",
"general_speech_sv": "Svenska",
"general_speech_tr": "Turkiska",
"general_speech_uk": "Ukrainska",
"general_speech_vi": "Vietnamesiska",
"general_speech_zh-CN": "Kinesiska (förenklad)",
"general_webui_title": "Hyperion - Webbkonfiguration",
@ -937,11 +1032,13 @@
"main_menu_dashboard_token": "Instrumentpanel",
"main_menu_effect_conf_token": "Effekter",
"main_menu_effectsconfigurator_token": "Effektkonfigurator",
"main_menu_event_services_token": "Händelsetjänster",
"main_menu_events": "Händelsetjänster",
"main_menu_general_conf_token": "Allmänt",
"main_menu_grabber_conf_token": "Hårdvara för upptagning",
"main_menu_input_selection_token": "val av ingång",
"main_menu_instcapture_conf_token": "Upptagningskällor",
"main_menu_leds_conf_token": "LED-Hårdvara",
"main_menu_leds_conf_token": "LED-utgång",
"main_menu_logging_token": "Logg",
"main_menu_network_conf_token": "Nätverk",
"main_menu_remotecontrol_token": "Fjärrkontroll",
@ -974,7 +1071,10 @@
"remote_losthint": "OBS: Alla ändringar kommer att gå förlorade efter en omstart.",
"remote_maptype_intro": "Vanligtvis avgör din LED-layout vilket bildområde som får vilken LED, detta kan ändras här. $1",
"remote_maptype_label": "LED-områdeskartering",
"remote_maptype_label_dominant_color": "Dominant Färg",
"remote_maptype_label_dominant_color_advanced": "Dominant Färg Avancerad",
"remote_maptype_label_multicolor_mean": "Flerfärgad",
"remote_maptype_label_multicolor_mean_squared": "Medelfärg i kvadrat",
"remote_maptype_label_unicolor_mean": "Enfärgad",
"remote_optgroup_syseffets": "Inkluderade effekter",
"remote_optgroup_templates_custom": "Användarmall",
@ -994,7 +1094,6 @@
"support_label_fbtext": "Dela innehåll på Facebook och håll dig själv och andra uppdaterade",
"support_label_forumtext": "Diskussion och hjälp från samhället",
"support_label_forumtitle": "Forum",
"support_label_ggtext": "Placera oss i dina cirklar på Google+",
"support_label_ghtext": "Besök oss på GitHub",
"support_label_igtext": "Ta en titt på Instagram!",
"support_label_intro": "Hyperion är ett gratis projekt med öppen källkod och ett litet team arbetar med vidareutvecklingen. Det är därför vi behöver DITT stöd för att fortsätta investera i bättre infrastruktur och vidareutveckling.",
@ -1046,7 +1145,7 @@
"wiz_cololight_noprops": "Det går inte att komma åt enhetsegenskaper - konfigurera antalet lysdioder manuellt.",
"wiz_cololight_title": "Cololight-installationsguide",
"wiz_guideyou": "$1 kommer att guida dig genom konfigurationen, tryck bara på knappen!",
"wiz_hue_blinkblue": "Få ID $1 att blinka blått",
"wiz_hue_blinkblue": "Låt det lysa upp",
"wiz_hue_clientkey": "Klientnyckel:",
"wiz_hue_create_user": "Skapa ny användare",
"wiz_hue_desc1": "1. Hue-brygga kommer att sökas efter automatiskt, om den inte hittas anger du IP-adressen och trycker på knappen \"ladda om\".<br> 2. Ange ett giltigt användar-ID. Detta kan också skapas här.",
@ -1079,9 +1178,16 @@
"wiz_identify_tip": "Identifiera konfigurerad enhet genom att tända den",
"wiz_ids_disabled": "Inaktiverad",
"wiz_ids_entire": "Hela bilden",
"wiz_layout": "Generera layout",
"wiz_layout_tip": "Generera en layout för den konfigurerade enheten",
"wiz_nanoleaf_failure_auth_token": "Tryck på strömbrytarknappen på din Nanoleaf-enhet inom 30 sekunder",
"wiz_nanoleaf_failure_auth_token_t": "Timeout vid generering av användarauktoriseringsnyckel",
"wiz_nanoleaf_press_onoff_button": "Tryck på strömbrytarknappen på din Nanoleaf-enhet i 5-7 sekunder",
"wiz_nanoleaf_user_auth_intro": "Guiden hjälper dig att generera ett användarauktoriseringsnyckel som krävs för att tillåta Hyperion att få åtkomst till enheten",
"wiz_nanoleaf_user_auth_title": "Guiden för generering av auktorisationsnyckel",
"wiz_noLights": "Inga $1s hittades! Anslut $1s till nätverket eller konfigurera dem manuellt.",
"wiz_pos": "Position/status",
"wiz_rgb_expl": "Färgpunkten ändrar färg (röd, grön) var x sekund, samtidigt ändrar dina lysdioder färg. Svara på frågorna nedan för att kontrollera/korrigera din RGB-byteordning.",
"wiz_rgb_expl": "Färgpricken byter färg (röd, grön) varje x sekunder, samtidigt som dina LED-lampor också byter färg. Besvara frågorna längst ner för att kontrollera/korrigera byteordningen.",
"wiz_rgb_intro1": "Den här guiden hjälper dig att hitta rätt byteordning för dina lysdioder. Klicka på Fortsätt för att börja.",
"wiz_rgb_intro2": "När behöver du denna assistent? För initial konfiguration eller om dina lysdioder ska vara röda, till exempel, men de är blå eller gröna.",
"wiz_rgb_q": "Vilken färg visar dina lysdioder när den färgade pricken överst...",

View File

@ -439,8 +439,6 @@
"edt_conf_smooth_heading_title": "Yumuşatma",
"edt_conf_smooth_interpolationRate_expl": "Düzgün ara çerçevelerin hesaplama hızı.",
"edt_conf_smooth_interpolationRate_title": "enterpolasyon oranı",
"edt_conf_smooth_outputRate_expl": "LED denetleyicinize çıkış hızı.",
"edt_conf_smooth_outputRate_title": ıkış Oranı",
"edt_conf_smooth_time_ms_expl": "Pürüzsüzleştirme, resimleri ne kadar süreyle toplamalıdır?",
"edt_conf_smooth_time_ms_title": "Zaman",
"edt_conf_smooth_type_expl": "Yumuşatma tipi",
@ -519,8 +517,6 @@
"edt_conf_webc_keyPath_title": "Özel anahtar yolu",
"edt_conf_webc_sslport_expl": "HTTPS Web sunucusu portu",
"edt_conf_webc_sslport_title": "HTTPS Portu",
"edt_dev_auth_key_title": "Kimlik Doğrulama Simgesi",
"edt_dev_auth_key_title_info": "Cihaza erişmek için Kimlik Doğrulama Simgesi gerekli",
"edt_dev_enum_sub_min_cool_adjust": "Soğuk beyazı çıkar",
"edt_dev_enum_sub_min_warm_adjust": "Sıcak beyazı çıkar",
"edt_dev_enum_subtract_minimum": "Minimum çıkar",
@ -573,7 +569,6 @@
"edt_dev_spec_gpioBcm_title": "GPIO Pini",
"edt_dev_spec_gpioMap_title": "GPIO eşlemesi",
"edt_dev_spec_gpioNumber_title": "GPIO numarası",
"edt_dev_spec_groupId_title": "Grup ID",
"edt_dev_spec_header_title": "Özel Ayarlar",
"edt_dev_spec_interpolation_title": "Enterpolasyon",
"edt_dev_spec_intervall_title": "Aralık",
@ -1034,7 +1029,6 @@
"wiz_cololight_noprops": "Cihaz özellikleri alınamıyor - Donanım LED sayısını manuel olarak tanımlayın",
"wiz_cololight_title": "Cololight Sihirbazı",
"wiz_guideyou": "$1 size ayarlar boyunca rehberlik edecek. Butona tıklamanız yeterli!",
"wiz_hue_blinkblue": "ID $1'ın mavi yanmasına izin verin",
"wiz_hue_clientkey": "istemci anahtarı",
"wiz_hue_create_user": "Yeni kullanıcı yarat",
"wiz_hue_desc1": "1. Hyperion bir Hue-Bridge'i otomatik olarak arar, bulamazsa ana bilgisayar adını veya IP adresini sağlamanız ve yeniden yükle düğmesine basmanız gerekir. <br> 2. Bir kullanıcı kimliği sağlayın, yoksa yeni bir tane oluşturun.",

View File

@ -0,0 +1,151 @@
{
"about_resources": "$1 бібліотек",
"about_translations": "Переклади",
"about_version": "Версія",
"conf_effect_path_intro": "Завантажте ефекти з обраних шляхів. Додатково ви можете вимкнути окремі ефекти за назвою, щоб приховати їх з усіх списків ефектів.",
"conf_general_impexp_expbtn": "Експорт",
"conf_general_impexp_impbtn": "Імпорт",
"conf_general_impexp_l1": "Імпортувуйте конфігурацію, вибравши файл конфігурації нижче і натисніть \"Імпорт\".",
"conf_general_impexp_l2": "Експортуйте конфігурацію, натиснувши \"Експорт\". Ваш браузер почне завантаження.",
"conf_general_impexp_title": "Налаштування Імпорту/Експорту",
"conf_general_intro": "Базові налаштування Hyperion та WebUI, які не підпадають під іншу категорію.",
"conf_general_label_title": "Загальні налаштування",
"conf_helptable_expl": "Пояснення",
"conf_helptable_option": "Опції",
"conf_leds_layout_btn_checklist": "Показати чеклист",
"conf_leds_layout_cl_bottom": "Низ",
"conf_leds_layout_cl_left": "Зліва",
"conf_leds_layout_cl_right": "Справа",
"conf_leds_layout_cl_top": "Верх",
"conf_leds_layout_preview_totalleds": "Всього LEDів:",
"conf_leds_optgroup_network": "Мережа",
"dashboard_alert_message_confedit": "Вашу конфігурацію Hyperion змінено. Перезапустіть Hyperion, щоб зміни спрацювали.",
"dashboard_alert_message_confedit_t": "Конфігурацію змінено",
"dashboard_alert_message_confsave_success": "Ваше налаштування Hyperion успішно збережено. Всі зміни активовано.",
"dashboard_alert_message_confsave_success_t": "Конфігурацію збережено",
"dashboard_componentbox_label_status": "Статус",
"dashboard_infobox_label_currenthyp": "Ваша версія Hyperion:",
"dashboard_infobox_label_disableh": "Вимкнути віртуальний сервер: $1",
"dashboard_infobox_label_enableh": "Увімкнути віртуальний сервер: $1",
"dashboard_infobox_label_instance": "Віртуальний сервер",
"dashboard_infobox_label_latesthyp": "Остання версія Hyperion:",
"dashboard_infobox_label_platform": "Платформа:",
"dashboard_infobox_label_port_boblight": "Boblight Сервер:",
"dashboard_infobox_label_port_flat": "Флетбуфер",
"dashboard_infobox_label_port_json": "JSON-Сервер:",
"dashboard_infobox_label_port_proto": "Протобуфер:",
"dashboard_infobox_label_ports": "Порти",
"dashboard_infobox_label_ports_websocket": "WebSocket (ws|wss):",
"dashboard_infobox_label_smartacc": "Розумний Доступ",
"dashboard_infobox_label_statush": "Статус Hyperion:",
"dashboard_infobox_label_title": "Інформація",
"dashboard_infobox_message_updatesuccess": "Ви використовуєте останню версію Hyperion.",
"dashboard_infobox_message_updatewarning": "Доступна нова версія Hyperion! ($1)",
"dashboard_label_intro": "Інформаційна панель дає вам швидкий огляд стану Hyperion",
"dashboard_message_do_not_show_again": "Більше не показувати це повідомлення",
"dashboard_newsbox_label_title": "Блог Hyperion",
"dashboard_newsbox_noconn": "Не вдається під'єднатися до сервера Hyperion. Щоб отримати останні дані, перевірте, чи працює ваше інтернет-з'єднання?",
"dashboard_newsbox_readmore": "Дізнатись більше",
"dashboard_newsbox_visitblog": "Відвідати блог Hyperion ",
"edt_conf_enum_action_restart": "Перезапустити",
"edt_conf_time_event_title": "Час",
"edt_conf_webc_port_title": "HHTP порт",
"edt_dev_spec_useAPIv2_title": "Використовувати API v2",
"effectsconfigurator_button_deleffect": "Видалити Ефект",
"effectsconfigurator_button_editeffect": "Завантажити Ефект",
"effectsconfigurator_button_saveeffect": "Зберегти Ефект",
"effectsconfigurator_button_starttest": "Розпочати тест",
"effectsconfigurator_button_stoptest": "Зупинити тест",
"effectsconfigurator_label_effectname": "Ім'я ефекту",
"general_access_advanced": "Розширений",
"general_access_default": "Звичайний",
"general_access_expert": "Експертний",
"general_btn_back": "Назад",
"general_btn_cancel": "Відмінити",
"general_btn_continue": "Продовжити",
"general_btn_iswitch": "Перемкнути",
"general_btn_next": "Наступний",
"general_btn_off": "Вимкнути",
"general_btn_ok": "ОК",
"general_btn_on": "Увімкнути",
"general_btn_restarthyperion": "Перезапустити Hyperion",
"general_btn_save": "Зберегти",
"general_btn_saveandreload": "Зберегти і перезавантажити",
"general_btn_yes": "Так",
"general_button_savesettings": "Зберегти налаштування",
"general_col_blue": "синій",
"general_col_green": "зелений",
"general_col_red": "червоний",
"general_comp_BLACKBORDER": "Визначення чорних смуг",
"general_comp_BOBLIGHTSERVER": "Boblight сервер",
"general_comp_FLATBUFSERVER": "Flatbuffers сервер",
"general_comp_FORWARDER": "Переадресація",
"general_comp_GRABBER": "Захоплення екрану",
"general_comp_LEDDEVICE": "LED Вихід",
"general_comp_PROTOSERVER": "Протокол Buffers сервер",
"general_comp_SMOOTHING": "Згладжування",
"general_comp_V4L": "USB Захоплення",
"general_country_de": "Німеччина",
"general_country_es": "Іспанія",
"general_country_fr": "Франція",
"general_country_it": "Італія",
"general_country_nl": "Нідерланди",
"general_country_uk": "Сполучене королівство",
"general_country_us": "США",
"general_speech_ca": "Каталанська",
"general_speech_cs": "Чеська",
"general_speech_de": "Німецька",
"general_speech_el": "Грецька",
"general_speech_en": "Англійська",
"general_speech_es": "Іспанська",
"general_speech_he": "Іврит",
"general_speech_hu": "Угорська",
"general_speech_id": "Індонезійська",
"general_speech_it": "Італійська",
"general_speech_ja": "Японська",
"general_speech_uk": "Українська",
"general_webui_title": "Hyperion — Веб-конфігурація",
"general_wiki_moreto": "Більше інформації про \"1$\" на нашому Wiki",
"infoDialog_general_error_title": "Помилка",
"infoDialog_general_success_title": "Успіх",
"info_conlost_label_reason": "Можлива причина:",
"main_ledsim_btn_togglelednumber": "Кількість LED",
"main_ledsim_btn_toggleleds": "Показати LEDs",
"main_ledsim_btn_togglelivevideo": "Live відео",
"main_ledsim_text": "Live візуалізація кольорів LED та відеопотоку з вашого пристрою захоплення.",
"main_ledsim_title": "Візуалізація LED",
"main_menu_about_token": "Про Hyperion",
"main_menu_colors_conf_token": "Обробка Зображення",
"main_menu_dashboard_token": "Інформаційна панель",
"main_menu_effect_conf_token": "Ефекти",
"main_menu_effectsconfigurator_token": "Конфігуратор ефектів",
"main_menu_general_conf_token": "Загальні",
"main_menu_grabber_conf_token": "Пристрої Захоплення",
"main_menu_input_selection_token": "Вибір Input",
"main_menu_leds_conf_token": "LED Вихід",
"main_menu_logging_token": "Логування",
"main_menu_network_conf_token": "Мережеві сервіси",
"main_menu_remotecontrol_token": "Віддалений Контроль",
"main_menu_support_token": "Підтримка",
"main_menu_system_token": "Система",
"main_menu_update_token": "Оновлення",
"main_menu_webconfig_token": "Веб конфігурація",
"remote_adjustment_label": "Корекція кольору",
"remote_color_label_color": "Колір:",
"remote_effects_label_effects": "Ефект:",
"remote_input_ip": "IP:",
"remote_input_priority": "Пріоритет",
"remote_optgroup_syseffets": "Системні Ефекти",
"remote_optgroup_usreffets": "Користувацькі Ефекти",
"remote_videoMode_2D": "2D",
"support_label_btctext": "Адреса:",
"support_label_forumtitle": "Форум",
"support_label_ghtext": "Відвідайте нас на GitHub",
"support_label_title": "Підтримати Hyperion",
"support_label_webpagetitle": "Домашня сторінка",
"support_label_wikititle": "Документація",
"update_button_install": "Встановити",
"update_label_description": "Опис:",
"update_label_type": "Тип:",
"update_versreminder": "Ваша версія: $1"
}

View File

@ -376,7 +376,6 @@
"edt_conf_webc_keyPath_title": "Đường dẫn khóa riêng",
"edt_conf_webc_sslport_expl": "Cổng của máy chủ web HTTPS",
"edt_conf_webc_sslport_title": "Cổng HTTPS",
"edt_dev_auth_key_title": "Mã xác thực",
"edt_dev_enum_sub_min_cool_adjust": "Trừ trắng mát",
"edt_dev_enum_sub_min_warm_adjust": "Trừ đi màu trắng ấm",
"edt_dev_enum_subtract_minimum": "Trừ tối thiểu",
@ -781,7 +780,6 @@
"wiz_cc_testintrowok": "Kiểm tra liên kết sau để tải xuống video thử nghiệm:",
"wiz_cc_title": "Thuật sĩ hiệu chỉnh màu",
"wiz_guideyou": "$ 1 sẽ hướng dẫn bạn thông qua các cài đặt. Chỉ cần nhấn nút!",
"wiz_hue_blinkblue": "Để ID $ 1 sáng lên màu xanh",
"wiz_hue_create_user": "Tạo người dùng mới",
"wiz_hue_desc1": "Nó tự động tìm kiếm một cây cầu màu sắc, trong trường hợp nó không thể tìm thấy một cái bạn cần cung cấp địa chỉ IP và nhấn nút tải lại ở bên phải. Bây giờ bạn cần một id người dùng, nếu bạn không có ai tạo một cái mới.",
"wiz_hue_desc2": "Bây giờ chọn đèn nào nên được thêm vào. Vị trí gán đèn cho một vị trí cụ thể trên \"bức tranh\" của bạn. Đèn bị vô hiệu hóa sẽ không được thêm vào. Để xác định đèn đơn nhấn nút bên phải.",

View File

@ -10,6 +10,9 @@
"InfoDialog_nowrite_foottext": "在解决问题后WebUI会自动在会被解锁",
"InfoDialog_nowrite_text": "Hyperion 无法写入您当前加载的配置文件。 请修复文件权限以继续。",
"InfoDialog_nowrite_title": "写入权限错误!",
"InfoDialog_systemRestart_title": "重启",
"InfoDialog_systemResume_title": "重新开始",
"InfoDialog_systemSuspend_title": "暂停",
"about_3rd_party_licenses": "第三方许可证",
"about_3rd_party_licenses_error": "我们无法从网络收集第三方方许可信息。 <br />请点击此链接访问 GitHub 资源。",
"about_build": "编译",
@ -41,6 +44,7 @@
"conf_general_inst_title": "LED硬件实例管理",
"conf_general_intro": "Hyperion 和 WebUI 的基本设置。",
"conf_general_label_title": "常规设置",
"conf_grabber_audio_intro": "音频捕获利用音频输入设备作为可视化的源。",
"conf_grabber_fg_intro": "屏幕捕获的输入源为安装了Hyperion本地系统的屏幕。",
"conf_grabber_inst_grabber_config_info": "conf_grabber_inst_grabber_config_info",
"conf_grabber_v4l_intro": "USB捕获的输入源为USB图像捕获设备。",
@ -55,7 +59,9 @@
"conf_leds_error_get_properties_title": "conf_leds_error_get_properties_title",
"conf_leds_error_hwled_gt_layout": "硬件LED数量($1)大于通过布局配置的LED数量($2)<br>$3 {{plural:$3|LED|LEDs}}将无法点亮。",
"conf_leds_error_hwled_gt_maxled": "conf_leds_error_hwled_gt_maxled",
"conf_leds_error_hwled_gt_maxled_protocol": "硬件LED数量($1)大于流协议支持的最大LED数量($2)。<br>流传输协议将更改为($3)。",
"conf_leds_error_hwled_lt_layout": "硬件LED数量($1)小于通过布局配置的LED数量($2)。 <br> 布局中配置的LED数量不得超过可用LED数量。",
"conf_leds_error_wled_segment_missing": "当前配置的分段($1)没有在您的WLED设备上配置。<br>您可能需要检查WLED配置!<br>配置页面表示当前的WLED设置。",
"conf_leds_info_ws281x": "conf_leds_info_ws281x",
"conf_leds_layout_advanced": "高级设置",
"conf_leds_layout_blacklist_num_title": "LED数量",
@ -64,6 +70,7 @@
"conf_leds_layout_blacklist_start_title": "起始LED",
"conf_leds_layout_blacklistleds_title": "黑名单LED",
"conf_leds_layout_btn_checklist": "显示检视清单",
"conf_leds_layout_btn_keystone": "梯形校正",
"conf_leds_layout_button_savelay": "保存布局",
"conf_leds_layout_button_updsim": "更新预览",
"conf_leds_layout_checkp1": "黑色LED为您的第一个即接收输入信号的第一个LED。",
@ -83,6 +90,16 @@
"conf_leds_layout_cl_leftbottom": "左侧50% - 100% 底部",
"conf_leds_layout_cl_leftmiddle": "左侧25% - 75% 中部",
"conf_leds_layout_cl_lefttop": "左侧0% - 50% 上部",
"conf_leds_layout_cl_lightPosBottomLeft11": "底部:由左起 75-100%",
"conf_leds_layout_cl_lightPosBottomLeft112": "底部:由左起 0-50%",
"conf_leds_layout_cl_lightPosBottomLeft12": "底部:由左起 25-50%",
"conf_leds_layout_cl_lightPosBottomLeft121": "底部:由左起 50-100%",
"conf_leds_layout_cl_lightPosBottomLeft14": "底部:由左起 0-25%",
"conf_leds_layout_cl_lightPosBottomLeft34": "底部:由左起 50-75%",
"conf_leds_layout_cl_lightPosBottomLeftNewMid": "底部:由左起 25-75%",
"conf_leds_layout_cl_lightPosTopLeft112": "顶部:由左起 0-50%",
"conf_leds_layout_cl_lightPosTopLeft121": "顶部:由左起 50-100%",
"conf_leds_layout_cl_lightPosTopLeftNewMid": "顶部:由左起 25-75%",
"conf_leds_layout_cl_overlap": "重叠",
"conf_leds_layout_cl_reversdir": "反方向",
"conf_leds_layout_cl_right": "右侧",
@ -207,6 +224,7 @@
"dashboard_newsbox_readmore": "更多消息",
"dashboard_newsbox_visitblog": "来康康我们的博客呢",
"edt_append_degree": "°",
"edt_append_frames": "框架",
"edt_append_hz": "Hz",
"edt_append_leds": "LEDs",
"edt_append_ms": "ms",
@ -217,6 +235,27 @@
"edt_append_pixel": "像素",
"edt_append_s": "s",
"edt_append_sdegree": "s/°",
"edt_conf_audio_device_expl": "选择音频输入设备",
"edt_conf_audio_device_title": "音频设备",
"edt_conf_audio_effect_enum_vumeter": "音量单位计",
"edt_conf_audio_effect_hotcolor_expl": "暖色",
"edt_conf_audio_effect_hotcolor_title": "暖色",
"edt_conf_audio_effect_multiplier_expl": "音频信号值增益",
"edt_conf_audio_effect_multiplier_title": "倍数",
"edt_conf_audio_effect_safecolor_expl": "安全颜色",
"edt_conf_audio_effect_safecolor_title": "安全颜色",
"edt_conf_audio_effect_safevalue_expl": "安全阈值",
"edt_conf_audio_effect_safevalue_title": "安全阈值",
"edt_conf_audio_effect_set_defaults": "重置为初始数值",
"edt_conf_audio_effect_tolerance_expl": "当从0-100自动计算信号增益时使用的公差",
"edt_conf_audio_effect_tolerance_title": "宽容度",
"edt_conf_audio_effect_warncolor_expl": "告警颜色",
"edt_conf_audio_effect_warncolor_title": "告警颜色",
"edt_conf_audio_effect_warnvalue_expl": "警告阈值",
"edt_conf_audio_effect_warnvalue_title": "警告阈值",
"edt_conf_audio_effects_expl": "要将音频信号转换为什么效果",
"edt_conf_audio_effects_title": "音频效果",
"edt_conf_audio_heading_title": "音频捕获",
"edt_conf_bb_blurRemoveCnt_expl": "从检测到的黑边而移除的模糊像素数量。",
"edt_conf_bb_blurRemoveCnt_title": "模糊像素",
"edt_conf_bb_borderFrameCnt_expl": "判定持续黑边所需帧数。",
@ -232,6 +271,8 @@
"edt_conf_bb_unknownFrameCnt_title": "未知帧数",
"edt_conf_bge_heading_title": "背景效果/颜色",
"edt_conf_bobls_heading_title": "Boblight服务",
"edt_conf_color_accuracyLevel_expl": "评估主色的准确度。更高的级别产生更准确的结果,但也需要更多的处理能力。应结合缩小像素处理。",
"edt_conf_color_accuracyLevel_title": "精度等级",
"edt_conf_color_backlightColored_expl": "给背景光加点颜色。",
"edt_conf_color_backlightColored_title": "颜色背景光",
"edt_conf_color_backlightThreshold_expl": "背景光最小亮度。在显示效果,颜色和状态为“关闭”时不启用。",
@ -242,6 +283,8 @@
"edt_conf_color_blue_title": "蓝色",
"edt_conf_color_brightnessComp_expl": "补偿红绿蓝、青色、品红、黄和白色之间的亮度差异。 100 表示全额补偿0 不补偿",
"edt_conf_color_brightnessComp_title": "亮度补偿",
"edt_conf_color_brightnessGain_expl": "调整颜色的亮度。1.0表示没有变化超过1.0亮度增加低于1.0亮度降低。",
"edt_conf_color_brightnessGain_title": "增加亮度",
"edt_conf_color_brightness_expl": "设置所有LED的亮度",
"edt_conf_color_brightness_title": "亮度",
"edt_conf_color_channelAdjustment_header_expl": "创建可以分配给特定组件的颜色配置文件。 调整颜色、伽马、亮度、补偿等。",
@ -268,6 +311,10 @@
"edt_conf_color_magenta_title": "品红",
"edt_conf_color_red_expl": "校准的红色色度。",
"edt_conf_color_red_title": "红色",
"edt_conf_color_reducedPixelSetFactorFactor_expl": "每个LED区域只控制一组像素低~25%,中~10%,高~6%",
"edt_conf_color_reducedPixelSetFactorFactor_title": "减少像素处理",
"edt_conf_color_saturationGain_expl": "调整颜色的饱和度。1.0表示没有变化超过1.0会增加饱和度低于1.0会降低饱和度。",
"edt_conf_color_saturationGain_title": "增加饱和度",
"edt_conf_color_white_expl": "校准的白色色度。",
"edt_conf_color_white_title": "白色",
"edt_conf_color_yellow_expl": "校准的黄色色度。",
@ -297,6 +344,8 @@
"edt_conf_enum_color": "颜色",
"edt_conf_enum_custom": "自定",
"edt_conf_enum_decay": "衰减",
"edt_conf_enum_delay": "仅延迟",
"edt_conf_enum_disabled": "禁用",
"edt_conf_enum_dl_error": "错误",
"edt_conf_enum_dl_informational": "信息性",
"edt_conf_enum_dl_nodebug": "无Debug输出",
@ -305,9 +354,12 @@
"edt_conf_enum_dl_verbose1": "详情等级1",
"edt_conf_enum_dl_verbose2": "详情等级2",
"edt_conf_enum_dl_verbose3": "详情等级3",
"edt_conf_enum_dominant_color": "主色-每个LED",
"edt_conf_enum_dominant_color_advanced": "主色 高级-每个LED",
"edt_conf_enum_effect": "效果",
"edt_conf_enum_gbr": "GBR",
"edt_conf_enum_grb": "GRB",
"edt_conf_enum_high": "高",
"edt_conf_enum_hsv": "HSV",
"edt_conf_enum_left_right": "左到右",
"edt_conf_enum_linear": "线性",
@ -315,7 +367,10 @@
"edt_conf_enum_logsilent": "Silent",
"edt_conf_enum_logverbose": "详情",
"edt_conf_enum_logwarn": "警告",
"edt_conf_enum_low": "低",
"edt_conf_enum_medium": "中等",
"edt_conf_enum_multicolor_mean": "彩色",
"edt_conf_enum_multicolor_mean_squared": "平均颜色-每个LED",
"edt_conf_enum_please_select": "请选择",
"edt_conf_enum_rbg": "RBG",
"edt_conf_enum_rgb": "RGB",
@ -323,6 +378,8 @@
"edt_conf_enum_top_down": "上到下",
"edt_conf_enum_transeffect_smooth": "平滑",
"edt_conf_enum_transeffect_sudden": "突变",
"edt_conf_enum_udp_ddp": "DDP",
"edt_conf_enum_udp_raw": "RAW",
"edt_conf_enum_unicolor_mean": "单色",
"edt_conf_fbs_heading_title": "Flatbuffers服务",
"edt_conf_fbs_timeout_expl": "如在指定时间没有收到数据,该组件将被禁用。",
@ -351,11 +408,18 @@
"edt_conf_fge_type_title": "类型",
"edt_conf_fw_flat_expl": "一行填一个Flatbuffer目标。包括IP:PORT (示例: 127.0.0.1:19401",
"edt_conf_fw_flat_itemtitle": "Flatbuffer目标",
"edt_conf_fw_flat_services_discovered_expl": "发现Hyperion服务器提供flatbuffer服务",
"edt_conf_fw_flat_services_discovered_title": "找到Flatbuffer目标",
"edt_conf_fw_flat_title": "Flatbuffer目标列表",
"edt_conf_fw_heading_title": "转发",
"edt_conf_fw_json_expl": "一行填一个json目标。包括IP:PORT (示例: 127.0.0.1:19446",
"edt_conf_fw_json_itemtitle": "Json目标",
"edt_conf_fw_json_services_discovered_expl": "发现Hyperion服务器提供JSON-API服务",
"edt_conf_fw_json_services_discovered_title": "找到的JSON目标",
"edt_conf_fw_json_title": "Json目标列表",
"edt_conf_fw_remote_service_discovered_none": "找不到远端服务",
"edt_conf_fw_service_name_expl": "服务提供商",
"edt_conf_fw_service_name_title": "服务名称",
"edt_conf_gen_configVersion_title": "配置版本",
"edt_conf_gen_heading_title": "常规设置",
"edt_conf_gen_name_expl": "用户自定Hyperion名称用于分辨多Hyperion实例时。",
@ -375,6 +439,8 @@
"edt_conf_grabber_discovered_title": "edt_conf_grabber_discovered_title",
"edt_conf_grabber_discovered_title_info": "edt_conf_grabber_discovered_title_info",
"edt_conf_grabber_discovery_inprogress": "edt_conf_grabber_discovery_inprogress",
"edt_conf_instC_audioEnable_expl": "为这个LED硬件实例启用音频捕获",
"edt_conf_instC_audioEnable_title": "启用音频捕获",
"edt_conf_instC_screen_grabber_device_expl": "edt_conf_instC_screen_grabber_device_expl",
"edt_conf_instC_screen_grabber_device_title": "edt_conf_instC_screen_grabber_device_title",
"edt_conf_instC_systemEnable_expl": "对该LED硬件实例启用屏幕捕获。",
@ -414,8 +480,6 @@
"edt_conf_smooth_heading_title": "平滑",
"edt_conf_smooth_interpolationRate_expl": "平滑插帧的计算速度。",
"edt_conf_smooth_interpolationRate_title": "插帧频率",
"edt_conf_smooth_outputRate_expl": "输出到LED控制器的速度。",
"edt_conf_smooth_outputRate_title": "输出速度",
"edt_conf_smooth_time_ms_expl": "平滑所需采集图像的时间。",
"edt_conf_smooth_time_ms_title": "时间",
"edt_conf_smooth_type_expl": "平滑类型。",
@ -492,16 +556,22 @@
"edt_conf_webc_keyPassPhrase_title": "密钥密码",
"edt_conf_webc_keyPath_expl": "密钥文件路径格式PEMRSA加密)",
"edt_conf_webc_keyPath_title": "私钥路径",
"edt_conf_webc_port_expl": "WebServer、RPC 和 WebSocket HTTP 连接的端口",
"edt_conf_webc_port_title": "HTTP 端口",
"edt_conf_webc_sslport_expl": "HTTPS服务使用端口",
"edt_conf_webc_sslport_title": "HTTPS端口",
"edt_dev_auth_key_title": "身份验证令牌",
"edt_dev_auth_key_title_info": "访问设备所需身份验证令牌",
"edt_dev_enum_sub_min_cool_adjust": "减去冷白",
"edt_dev_enum_sub_min_warm_adjust": "减去暖白",
"edt_dev_enum_subtract_minimum": "减去最小值",
"edt_dev_enum_white_off": "白色关闭",
"edt_dev_general_autostart_title": "自动启动",
"edt_dev_general_autostart_title_info": "LED 设备在启动时是否已打开",
"edt_dev_general_colorOrder_title": "RGB顺序",
"edt_dev_general_colorOrder_title_info": "该设备颜色顺序",
"edt_dev_general_enableAttemptsInterval_title": "重试间隔",
"edt_dev_general_enableAttemptsInterval_title_info": "两次重连之间的间隔。",
"edt_dev_general_enableAttempts_title": "连接尝试",
"edt_dev_general_enableAttempts_title_info": "在设备报错前的尝试连接数",
"edt_dev_general_hardwareLedCount_title": "硬件LED总数",
"edt_dev_general_hardwareLedCount_title_info": "改设备使用的实体LED总数",
"edt_dev_general_heading_title": "常规设置",
@ -512,12 +582,17 @@
"edt_dev_spec_FCsetConfig_title": "Fadecandy配置",
"edt_dev_spec_LBap102Mode_title": "LightBerry APA102模式",
"edt_dev_spec_PBFiFo_title": "Pi-Blaster FiFo",
"edt_dev_spec_ada_mode_title": "Adalight -标准",
"edt_dev_spec_awa_mode_title": "HyperSerial -高速",
"edt_dev_spec_baudrate_title": "比特率",
"edt_dev_spec_blackLightsTimeout_title": "黑色信号检测超时",
"edt_dev_spec_brightnessFactor_title": "亮度因数",
"edt_dev_spec_brightnessMax_title": "最大亮度",
"edt_dev_spec_brightnessMin_title": "最小亮度",
"edt_dev_spec_brightnessOverwrite_title": "覆盖亮度",
"edt_dev_spec_brightnessThreshold_title": "信号检测亮度最小值",
"edt_dev_spec_brightness_title": "亮度",
"edt_dev_spec_candyGamma_title": "“糖果”模式(双伽马校正)",
"edt_dev_spec_chanperfixture_title": "每个Fixture通道数",
"edt_dev_spec_cid_title": "CID",
"edt_dev_spec_clientKey_title": "客户端密钥",
@ -537,7 +612,6 @@
"edt_dev_spec_gpioBcm_title": "GPIO针脚",
"edt_dev_spec_gpioMap_title": "GPIO映射",
"edt_dev_spec_gpioNumber_title": "GPIO针脚号",
"edt_dev_spec_groupId_title": "组ID",
"edt_dev_spec_header_title": "特别设定",
"edt_dev_spec_interpolation_title": "插值",
"edt_dev_spec_intervall_title": "间隔时间",
@ -557,6 +631,8 @@
"edt_dev_spec_networkDeviceName_title": "网络设备名称",
"edt_dev_spec_networkDevicePort_title": "端口",
"edt_dev_spec_numberOfLeds_title": "LED数量",
"edt_dev_spec_onBlackTimeToPowerOff": "如果黑电平被触发,关灯时间",
"edt_dev_spec_onBlackTimeToPowerOn": "如果信号恢复,开灯时间",
"edt_dev_spec_orbIds_title": "球ID(s)",
"edt_dev_spec_order_left_right_title": "2.",
"edt_dev_spec_order_top_down_title": "1.",
@ -564,19 +640,34 @@
"edt_dev_spec_panel_start_position": "开始面板 [0-max 面板]",
"edt_dev_spec_panelorganisation_title": "面板编号顺序",
"edt_dev_spec_pid_title": "PID",
"edt_dev_spec_port_expl": "服务端口 [1-65535]",
"edt_dev_spec_port_title": "端口",
"edt_dev_spec_printTimeStamp_title": "加时间戳",
"edt_dev_spec_pwmChannel_title": "PWM通道",
"edt_dev_spec_razer_device_title": "edt_dev_spec_razer_device_title",
"edt_dev_spec_restoreOriginalState_title": "恢复灯状态",
"edt_dev_spec_restoreOriginalState_title_info": "设备不启用时恢复设备原始状态",
"edt_dev_spec_rgbw_calibration_blue": "蓝/白通道外观",
"edt_dev_spec_rgbw_calibration_enable": "白色通道校准(仅限RGBW)",
"edt_dev_spec_rgbw_calibration_green": "绿/白通道外观",
"edt_dev_spec_rgbw_calibration_limit": "白色通道限制",
"edt_dev_spec_rgbw_calibration_red": "红/白通道外观",
"edt_dev_spec_segmentId_title": "分段ID",
"edt_dev_spec_segmentsOverlapValidation_error": "纠正WLED设置! 分段不能与{{复数:$1| segment|segments}}: \"$2\"重叠。",
"edt_dev_spec_segmentsSwitchOffOthers_title": "关闭其他分段",
"edt_dev_spec_segments_disabled_title": "在WLED上禁用分段流。",
"edt_dev_spec_segments_title": "分段流",
"edt_dev_spec_serial_title": "序列号",
"edt_dev_spec_spipath_title": "SPI设备",
"edt_dev_spec_sslHSTimeoutMax_title": "推流握手超时最大值",
"edt_dev_spec_sslHSTimeoutMin_title": "推流握手超时最小值",
"edt_dev_spec_stayOnAfterStreaming_title": "流传输结束后继续保持打开状态",
"edt_dev_spec_stayOnAfterStreaming_title_info": "流传输结束或恢复状态后,设备将保持打开状态",
"edt_dev_spec_stream_protocol_title": "流媒体协议",
"edt_dev_spec_switchOffOnBlack_title": "黑屏时关闭",
"edt_dev_spec_switchOffOnbelowMinBrightness_title": "小于最小值时关闭",
"edt_dev_spec_syncOverwrite_title": "禁用同步",
"edt_dev_spec_targetIpHost_expl": "主机名DNS/mDNS或者IP地址IPv4 或 IPv6",
"edt_dev_spec_targetIpHost_title": "目标Hostname/IP",
"edt_dev_spec_targetIpHost_title_info": "设备的或IP地址",
"edt_dev_spec_targetIp_title": "目标IP",
@ -795,6 +886,7 @@
"general_col_blue": "蓝色",
"general_col_green": "绿色",
"general_col_red": "红色",
"general_comp_AUDIO": "音频捕获",
"general_comp_BLACKBORDER": "黑边检测",
"general_comp_BOBLIGHTSERVER": "Boblight服务器",
"general_comp_FLATBUFSERVER": "Flatbuffers服务器",
@ -815,14 +907,17 @@
"general_country_us": "美国",
"general_disabled": "禁用",
"general_enabled": "启用",
"general_speech_ca": "加泰罗尼亚语",
"general_speech_cs": "捷克语",
"general_speech_da": "general_speech_da",
"general_speech_de": "德语",
"general_speech_el": "希腊语",
"general_speech_en": "英语",
"general_speech_es": "西班牙语",
"general_speech_fr": "法语",
"general_speech_hu": "general_speech_hu",
"general_speech_it": "意大利语",
"general_speech_ja": "日文",
"general_speech_nb": "挪威语",
"general_speech_nl": "荷兰语",
"general_speech_pl": "波兰语",
@ -915,7 +1010,10 @@
"remote_losthint": "注意:所有更改将在重新启动后丢失。",
"remote_maptype_intro": "通常 LED 布局定义了哪个 LED 覆盖特定的图片区域。 你可以在这里改变它:$1.",
"remote_maptype_label": "映射类型",
"remote_maptype_label_dominant_color": "主色",
"remote_maptype_label_dominant_color_advanced": "主色 高级",
"remote_maptype_label_multicolor_mean": "彩色",
"remote_maptype_label_multicolor_mean_squared": "平均颜色",
"remote_maptype_label_unicolor_mean": "单色",
"remote_optgroup_syseffets": "预制效果",
"remote_optgroup_templates_custom": "用户模板",

View File

@ -280,6 +280,7 @@
<li>
<a class="inactive"><i class="fa fa-industry fa-fw"></i><span data-i18n="main_menu_system_token">System</span><span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
<li> <a class="inactive mnava" id="MenuItemEventServices" href="#conf_events"><i class="fa fa-server fa-fw"></i><span data-i18n="main_menu_event_services_token">Event Services</span></a> </li>
<li> <a class="inactive mnava" id="MenuItemWeb" href="#conf_webconfig" id="load_webconfig"><i class="fa fa-wrench fa-fw"></i><span data-i18n="main_menu_webconfig_token">Webconfiguration</span></a> </li>
<li> <a class="inactive mnava" id="MenuItemLogging" href="#conf_logging"><i class="fa fa-reorder fa-fw"></i><span data-i18n="main_menu_logging_token">Log</span></a> </li>
<li> <a class="inactive mnava" href="#update"><i class="fa fa-download fa-fw"></i><span data-i18n="main_menu_update_token">Update</span></a> </li>

View File

@ -0,0 +1,164 @@
$(document).ready(function () {
performTranslation();
let isGuiMode = window.sysInfo.hyperion.isGuiMode;
const CEC_ENABLED = (jQuery.inArray("cec", window.serverInfo.services) !== -1);
let conf_editor_osEvents = null;
let conf_editor_cecEvents = null;
let conf_editor_schedEvents = null;
if (window.showOptHelp) {
//Operating System Events
$('#conf_cont').append(createRow('conf_cont_os_events'));
$('#conf_cont_os_events').append(createOptPanel('fa-laptop', $.i18n("conf_os_events_heading_title"), 'editor_container_os_events', 'btn_submit_os_events', 'panel-system'));
$('#conf_cont_os_events').append(createHelpTable(window.schema.osEvents.properties, $.i18n("conf_os_events_heading_title")));
//Scheduled Events
$('#conf_cont').append(createRow('conf_cont_sched_events'));
$('#conf_cont_sched_events').append(createOptPanel('fa-laptop', $.i18n("conf_sched_events_heading_title"), 'editor_container_sched_events', 'btn_submit_sched_events', 'panel-system'));
$('#conf_cont_sched_events').append(createHelpTable(window.schema.schedEvents.properties, $.i18n("conf_sched_events_heading_title")));
//CEC Events
if (CEC_ENABLED) {
$('#conf_cont').append(createRow('conf_cont_event_cec'));
$('#conf_cont_event_cec').append(createOptPanel('fa-tv', $.i18n("conf_cec_events_heading_title"), 'editor_container_cec_events', 'btn_submit_cec_events', 'panel-system'));
$('#conf_cont_event_cec').append(createHelpTable(window.schema.cecEvents.properties, $.i18n("conf_cec_events_heading_title"), "cecEventsHelpPanelId"));
}
}
else {
$('#conf_cont').addClass('row');
$('#conf_cont').append(createOptPanel('fa-laptop', $.i18n("conf_os_events_heading_title"), 'editor_container_os_events', 'btn_submit_os_events'));
$('#conf_cont').append(createOptPanel('fa-laptop', $.i18n("conf_sched_events_heading_title"), 'editor_container_sched_events', 'btn_submit_sched_events'));
if (CEC_ENABLED) {
$('#conf_cont').append(createOptPanel('fa-tv', $.i18n("conf_cec_events_heading_title"), 'editor_container_cec_events', 'btn_submit_cec_events'));
}
}
function findDuplicateEventsIndices(data) {
const eventIndices = {};
data.forEach((item, index) => {
const event = item.event;
if (!eventIndices[event]) {
eventIndices[event] = [index];
} else {
eventIndices[event].push(index);
}
});
return Object.values(eventIndices).filter(indices => indices.length > 1);
}
JSONEditor.defaults.custom_validators.push(function (schema, value, path) {
let errors = [];
if (schema.type === 'array' && Array.isArray(value)) {
const duplicateEventIndices = findDuplicateEventsIndices(value);
if (duplicateEventIndices.length > 0) {
let recs;
duplicateEventIndices.forEach(indices => {
const displayIndices = indices.map(index => index + 1);
recs = displayIndices.join(', ');
});
errors.push({
path: path,
message: $.i18n('edt_conf_action_record_validation_error', recs)
});
}
}
return errors;
});
//Operating System Events
conf_editor_osEvents = createJsonEditor('editor_container_os_events', {
osEvents: window.schema.osEvents
}, true, true);
conf_editor_osEvents.on('ready', function () {
if (!isGuiMode) {
showInputOptionsForKey(conf_editor_osEvents, "osEvents", "suspendEnable", false);
}
});
conf_editor_osEvents.on('change', function () {
conf_editor_osEvents.validate().length || window.readOnlyMode ? $('#btn_submit_os_events').prop('disabled', true) : $('#btn_submit_os_events').prop('disabled', false);
});
$('#btn_submit_os_events').off().on('click', function () {
requestWriteConfig(conf_editor_osEvents.getValue());
});
//Scheduled Events
conf_editor_schedEvents = createJsonEditor('editor_container_sched_events', {
schedEvents: window.schema.schedEvents
}, true, true);
conf_editor_schedEvents.on('change', function () {
const schedEventsEnable = conf_editor_schedEvents.getEditor("root.schedEvents.enable").getValue();
if (schedEventsEnable) {
showInputOptionsForKey(conf_editor_schedEvents, "schedEvents", "enable", true);
$('#schedEventsHelpPanelId').show();
} else {
showInputOptionsForKey(conf_editor_schedEvents, "schedEvents", "enable", false);
$('#schedEventsHelpPanelId').hide();
}
conf_editor_schedEvents.validate().length || window.readOnlyMode ? $('#btn_submit_sched_events').prop('disabled', true) : $('#btn_submit_sched_events').prop('disabled', false);
});
$('#btn_submit_sched_events').off().on('click', function () {
const saveOptions = conf_editor_schedEvents.getValue();
// Workaround, as otherwise values are not reflected correctly
saveOptions.schedEvents.enable = conf_editor_schedEvents.getEditor("root.schedEvents.enable").getValue();
saveOptions.schedEvents.actions = conf_editor_schedEvents.getEditor("root.schedEvents.actions").getValue();
requestWriteConfig(saveOptions);
});
//CEC Events
if (CEC_ENABLED) {
conf_editor_cecEvents = createJsonEditor('editor_container_cec_events', {
cecEvents: window.schema.cecEvents
}, true, true);
conf_editor_cecEvents.on('change', function () {
const cecEventsEnable = conf_editor_cecEvents.getEditor("root.cecEvents.enable").getValue();
if (cecEventsEnable) {
showInputOptionsForKey(conf_editor_cecEvents, "cecEvents", "enable", true);
$('#cecEventsHelpPanelId').show();
} else {
showInputOptionsForKey(conf_editor_cecEvents, "cecEvents", "enable", false);
$('#cecEventsHelpPanelId').hide();
}
conf_editor_cecEvents.validate().length || window.readOnlyMode ? $('#btn_submit_cec_events').prop('disabled', true) : $('#btn_submit_cec_events').prop('disabled', false);
});
$('#btn_submit_cec_events').off().on('click', function () {
const saveOptions = conf_editor_cecEvents.getValue();
// Workaround, as otherwise values are not reflected correctly
saveOptions.cecEvents.enable = conf_editor_cecEvents.getEditor("root.cecEvents.enable").getValue();
saveOptions.cecEvents.actions = conf_editor_cecEvents.getEditor("root.cecEvents.actions").getValue();
requestWriteConfig(saveOptions);
});
}
//create introduction
if (window.showOptHelp) {
createHint("intro", $.i18n('conf_os_events_intro'), "editor_container_os_events");
if (CEC_ENABLED) {
createHint("intro", $.i18n('conf_cec_events_intro'), "editor_container_cec_events");
}
}
removeOverlay();
});

View File

@ -5,7 +5,6 @@ $(document).ready(function () {
var screenGrabberAvailable = (window.serverInfo.grabbers.screen.available.length !== 0);
var videoGrabberAvailable = (window.serverInfo.grabbers.video.available.length !== 0);
const audioGrabberAvailable = (window.serverInfo.grabbers.audio.available.length !== 0);
var CEC_ENABLED = (jQuery.inArray("cec", window.serverInfo.services) !== -1);
var conf_editor_video = null;
var conf_editor_audio = null;
@ -327,7 +326,7 @@ $(document).ready(function () {
var saveOptions = conf_editor_screen.getValue();
var instCaptOptions = window.serverConfig.instCapture;
instCaptOptions.systemEnable = true;
instCaptOptions.systemEnable = saveOptions.framegrabber.enable;
saveOptions.instCapture = instCaptOptions;
requestWriteConfig(saveOptions);
@ -369,11 +368,6 @@ $(document).ready(function () {
conf_editor_video.on('change', function () {
// Hide elements not supported by the backend
if (window.serverInfo.cec.enabled === false || !CEC_ENABLED) {
showInputOptionForItem(conf_editor_video, "grabberV4L2", "cecDetection", false);
}
// Validate the current editor's content
if (!conf_editor_video.validate().length) {
var deviceSelected = conf_editor_video.getEditor("root.grabberV4L2.available_devices").getValue();
@ -679,7 +673,7 @@ $(document).ready(function () {
var saveOptions = conf_editor_video.getValue();
var instCaptOptions = window.serverConfig.instCapture;
instCaptOptions.v4lEnable = true;
instCaptOptions.v4lEnable = saveOptions.grabberV4L2.enable;
saveOptions.instCapture = instCaptOptions;
requestWriteConfig(saveOptions);
@ -805,7 +799,7 @@ $(document).ready(function () {
const saveOptions = conf_editor_audio.getValue();
const instCaptOptions = window.serverConfig.instCapture;
instCaptOptions.audioEnable = true;
instCaptOptions.audioEnable = saveOptions.grabberAudio.enable;
saveOptions.instCapture = instCaptOptions;
requestWriteConfig(saveOptions);

View File

@ -1,52 +0,0 @@
$(document).ready( function() {
$("#create_user").on("click", function() {
var connectionRetries = 15;
var data = {"devicetype":"hyperion#"+Date.now()};
var UserInterval = setInterval(function(){
$.ajax({
type: "POST",
url: 'http://'+$("#ip").val()+'/api',
processData: false,
timeout: 1000,
contentType: 'application/json',
data: JSON.stringify(data),
success: function(r) {
connectionRetries--;
$("#connectionTime").html(connectionRetries);
if(connectionRetries == 0) {
abortConnection(UserInterval);
}
else
{
$("#abortConnection").hide();
$('#pairmodal').modal('show');
$("#ip_alert").hide();
if (typeof r[0].error != 'undefined') {
console.log("link not pressed");
}
if (typeof r[0].success != 'undefined') {
$('#pairmodal').modal('hide');
$('#user').val(r[0].success.username);
$( "#hue_lights" ).empty();
get_hue_lights();
clearInterval(UserInterval);
}
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
$("#ip_alert").show();
clearInterval(UserInterval);
}
});
},1000);
});
function abortConnection(UserInterval){
clearInterval(UserInterval);
$("#abortConnection").show();
$('#pairmodal').modal('hide');
}
});

View File

@ -73,26 +73,30 @@ $(document).ready(function () {
//End language selection
$(window.hyperion).on("cmd-authorize-tokenRequest cmd-authorize-getPendingTokenRequests", function (event) {
var val = event.response.info;
if (Array.isArray(event.response.info)) {
if (event.response.info.length == 0) {
return
}
val = event.response.info[0]
if (val.comment == '')
$('#modal_dialog').modal('hide');
}
showInfoDialog("grantToken", $.i18n('conf_network_tok_grantT'), $.i18n('conf_network_tok_grantMsg') + '<br><span style="font-weight:bold">App: ' + val.comment + '</span><br><span style="font-weight:bold">Code: ' + val.id + '</span>')
$("#tok_grant_acc").off().on('click', function () {
tokenList.push(val)
// forward event, in case we need to rebuild the list now
$(window.hyperion).trigger({ type: "build-token-list" });
requestHandleTokenRequest(val.id, true)
});
$("#tok_deny_acc").off().on('click', function () {
requestHandleTokenRequest(val.id, false)
});
if (event.response && event.response.info !== undefined) {
var val = event.response.info;
if (Array.isArray(event.response.info)) {
if (event.response.info.length == 0) {
return
}
val = event.response.info[0]
if (val.comment == '')
$('#modal_dialog').modal('hide');
}
showInfoDialog("grantToken", $.i18n('conf_network_tok_grantT'), $.i18n('conf_network_tok_grantMsg') + '<br><span style="font-weight:bold">App: ' + val.comment + '</span><br><span style="font-weight:bold">Code: ' + val.id + '</span>')
$("#tok_grant_acc").off().on('click', function () {
tokenList.push(val)
// forward event, in case we need to rebuild the list now
$(window.hyperion).trigger({ type: "build-token-list" });
requestHandleTokenRequest(val.id, true)
});
$("#tok_deny_acc").off().on('click', function () {
requestHandleTokenRequest(val.id, false)
});
}
});
$(window.hyperion).one("cmd-authorize-getTokenList", function (event) {
@ -186,21 +190,12 @@ $(document).ready(function () {
}
});
$(window.hyperion).on("cmd-authorize-adminRequired", function (event) {
//Check if a admin login is required.
//If yes: check if default pw is set. If no: go ahead to get server config and render page
if (event.response.info.adminRequired === true)
requestRequiresDefaultPasswortChange();
else
requestServerConfigSchema();
});
$(window.hyperion).on("error", function (event) {
//If we are getting an error "No Authorization" back with a set loginToken we will forward to new Login (Token is expired.
//e.g.: hyperiond was started new in the meantime)
if (event.reason == "No Authorization" && getStorage("loginToken")) {
removeStorage("loginToken");
requestRequiresAdminAuth();
requestRequiresDefaultPasswortChange();
}
else if (event.reason == "Selected Hyperion instance isn't running") {
//Switch to default instance
@ -211,14 +206,16 @@ $(document).ready(function () {
});
$(window.hyperion).on("open", function (event) {
requestRequiresAdminAuth();
requestRequiresDefaultPasswortChange();
});
$(window.hyperion).on("ready", function (event) {
loadContent(undefined,true);
//Hide capture menu entries, if no grabbers are available
if ((window.serverInfo.grabbers.screen.available.length === 0) && (window.serverInfo.grabbers.video.available.length === 0)) {
if ((window.serverInfo.grabbers.screen.available.length === 0) &&
(window.serverInfo.grabbers.video.available.length === 0) &&
(window.serverInfo.grabbers.audio.available.length === 0)) {
$("#MenuItemGrabber").attr('style', 'display:none')
if ((jQuery.inArray("boblight", window.serverInfo.services) === -1)) {
$("#MenuItemInstCapture").attr('style', 'display:none')

View File

@ -469,17 +469,18 @@ function createClassicLeds() {
aceEdt.set(finalLedArray);
}
function createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction) {
function createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction, gap) {
// Big thank you to RanzQ (Juha Rantanen) from Github for this script
// https://raw.githubusercontent.com/RanzQ/hyperion-audio-effects/master/matrix-config.js
var parallel = false
var leds = []
var hblock = 1.0 / ledshoriz
var vblock = 1.0 / ledsvert
let parallel = false;
const leds = [];
const hblock = (1.0 - gap.left - gap.right) / ledshoriz;
const vblock = (1.0 - gap.top - gap.bottom) / ledsvert;
if (cabling == "parallel") {
parallel = true
parallel = true;
}
/**
@ -488,10 +489,10 @@ function createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction) {
* @param {Number} y Vertical position in matrix
*/
function addLed(x, y) {
var hscanMin = x * hblock
var hscanMax = (x + 1) * hblock
var vscanMin = y * vblock
var vscanMax = (y + 1) * vblock
let hscanMin = gap.left + (x * hblock);
let hscanMax = gap.left + (x + 1) * hblock;
let vscanMin = gap.top + y * vblock;
let vscanMax = gap.top + (y + 1) * vblock;
hscanMin = round(hscanMin);
hscanMax = round(hscanMax);
@ -503,43 +504,41 @@ function createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction) {
hmax: hscanMax,
vmin: vscanMin,
vmax: vscanMax
})
});
}
var startYX = start.split('-')
var startX = startYX[1] === 'right' ? ledshoriz - 1 : 0
var startY = startYX[0] === 'bottom' ? ledsvert - 1 : 0
var endX = startX === 0 ? ledshoriz - 1 : 0
var endY = startY === 0 ? ledsvert - 1 : 0
var forward = startX < endX
const startYX = start.split('-');
let startX = startYX[1] === 'right' ? ledshoriz - 1 : 0;
let startY = startYX[0] === 'bottom' ? ledsvert - 1 : 0;
let endX = startX === 0 ? ledshoriz - 1 : 0;
let endY = startY === 0 ? ledsvert - 1 : 0;
let forward = startX < endX;
let downward = startY < endY;
var downward = startY < endY
var x, y
let x, y;
if (direction === 'vertical') {
for (x = startX; forward && x <= endX || !forward && x >= endX; x += forward ? 1 : -1) {
for (y = startY; downward && y <= endY || !downward && y >= endY; y += downward ? 1 : -1) {
addLed(x, y)
addLed(x, y);
}
if (!parallel) {
downward = !downward
var tmp = startY
startY = endY
endY = tmp
downward = !downward;
const tmp = startY;
startY = endY;
endY = tmp;
}
}
} else {
for (y = startY; downward && y <= endY || !downward && y >= endY; y += downward ? 1 : -1) {
for (x = startX; forward && x <= endX || !forward && x >= endX; x += forward ? 1 : -1) {
addLed(x, y)
addLed(x, y);
}
if (!parallel) {
forward = !forward
var tmp = startX
startX = endX
endX = tmp
forward = !forward;
const tmp = startX;
startX = endX;
endX = tmp;
}
}
}
@ -552,13 +551,20 @@ function createMatrixLeds() {
// https://raw.githubusercontent.com/RanzQ/hyperion-audio-effects/master/matrix-config.js
//get values
var ledshoriz = parseInt($("#ip_ma_ledshoriz").val());
var ledsvert = parseInt($("#ip_ma_ledsvert").val());
var cabling = $("#ip_ma_cabling").val();
var direction = $("#ip_ma_direction").val();
var start = $("#ip_ma_start").val();
const ledshoriz = parseInt($("#ip_ma_ledshoriz").val());
const ledsvert = parseInt($("#ip_ma_ledsvert").val());
const cabling = $("#ip_ma_cabling").val();
const direction = $("#ip_ma_direction").val();
const start = $("#ip_ma_start").val();
const gap = {
//gap values % -> float
left: parseInt($("#ip_ma_gapleft").val()) / 100,
right: parseInt($("#ip_ma_gapright").val()) / 100,
top: parseInt($("#ip_ma_gaptop").val()) / 100,
bottom: parseInt($("#ip_ma_gapbottom").val()) / 100,
};
nonBlacklistLedArray = createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction);
nonBlacklistLedArray = createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction, gap);
finalLedArray = blackListLeds(nonBlacklistLedArray, ledBlacklist);
createLedPreview(finalLedArray);
@ -798,6 +804,35 @@ $(document).ready(function () {
$('.ledMAconstr').on("change", function () {
valValue(this.id, this.value, this.min, this.max);
// top/bottom and left/right must not overlap
switch (this.id) {
case "ip_ma_gapleft":
let left = 100 - parseInt($("#ip_ma_gapright").val());
if (this.value > left) {
$(this).val(left);
}
break;
case "ip_ma_gapright":
let right = 100 - parseInt($("#ip_ma_gapleft").val());
if (this.value > right) {
$(this).val(right);
}
break;
case "ip_ma_gaptop":
let top = 100 - parseInt($("#ip_ma_gapbottom").val());
if (this.value > top) {
$(this).val(top);
}
break;
case "ip_ma_gapbottom":
let bottom = 100 - parseInt($("#ip_ma_gaptop").val());
if (this.value > bottom) {
$(this).val(bottom);
}
break;
default:
}
createMatrixLeds();
});
@ -1019,33 +1054,28 @@ $(document).ready(function () {
});
$("#leddevices").off().on("change", function () {
var generalOptions = window.serverSchema.properties.device;
const generalOptions = window.serverSchema.properties.device;
var ledType = $(this).val();
// philipshueentertainment backward fix
if (ledType == "philipshueentertainment")
ledType = "philipshue";
var specificOptions = window.serverSchema.properties.alldevices[ledType];
const ledType = $(this).val();
const specificOptions = window.serverSchema.properties.alldevices[ledType];
conf_editor = createJsonEditor('editor_container_leddevice', {
specificOptions: specificOptions,
generalOptions: generalOptions,
});
var values_general = {};
var values_specific = {};
var isCurrentDevice = (window.serverConfig.device.type == ledType);
let values_general = {};
let values_specific = {};
const isCurrentDevice = (window.serverConfig.device.type == ledType);
for (var key in window.serverConfig.device) {
for (const key in window.serverConfig.device) {
if (key != "type" && key in generalOptions.properties) values_general[key] = window.serverConfig.device[key];
};
conf_editor.getEditor("root.generalOptions").setValue(values_general);
if (isCurrentDevice) {
var specificOptions_val = conf_editor.getEditor("root.specificOptions").getValue();
for (var key in specificOptions_val) {
const specificOptions_val = conf_editor.getEditor("root.specificOptions").getValue();
for (const key in specificOptions_val) {
values_specific[key] = (key in window.serverConfig.device) ? window.serverConfig.device[key] : specificOptions_val[key];
};
conf_editor.getEditor("root.specificOptions").setValue(values_specific);
@ -1056,43 +1086,15 @@ $(document).ready(function () {
// change save button state based on validation result
conf_editor.validate().length || window.readOnlyMode ? $('#btn_submit_controller').prop('disabled', true) : $('#btn_submit_controller').prop('disabled', false);
// led controller sepecific wizards
$('#btn_wiz_holder').html("");
$('#btn_led_device_wiz').off();
if (ledType == "philipshue") {
$('#root_specificOptions_useEntertainmentAPI').on("change", function () {
var ledWizardType = (this.checked) ? "philipshueentertainment" : ledType;
var data = { type: ledWizardType };
var hue_title = (this.checked) ? 'wiz_hue_e_title' : 'wiz_hue_title';
changeWizard(data, hue_title, startWizardPhilipsHue);
});
$("#root_specificOptions_useEntertainmentAPI").trigger("change");
}
else if (ledType == "atmoorb") {
var ledWizardType = (this.checked) ? "atmoorb" : ledType;
var data = { type: ledWizardType };
var atmoorb_title = 'wiz_atmoorb_title';
changeWizard(data, atmoorb_title, startWizardAtmoOrb);
}
else if (ledType == "yeelight") {
var ledWizardType = (this.checked) ? "yeelight" : ledType;
var data = { type: ledWizardType };
var yeelight_title = 'wiz_yeelight_title';
changeWizard(data, yeelight_title, startWizardYeelight);
}
function changeWizard(data, hint, fn) {
$('#btn_wiz_holder').html("")
createHint("wizard", $.i18n(hint), "btn_wiz_holder", "btn_led_device_wiz");
$('#btn_led_device_wiz').off().on('click', data, fn);
}
// LED controller specific wizards
createLedDeviceWizards(ledType);
conf_editor.on('ready', function () {
var hwLedCountDefault = 1;
var colorOrderDefault = "rgb";
var filter = {};
let hwLedCountDefault = 1;
let colorOrderDefault = "rgb";
let filter = {};
$('#btn_layout_controller').hide();
$('#btn_test_controller').hide();
switch (ledType) {
@ -1145,66 +1147,55 @@ $(document).ready(function () {
showNotification('danger', "Device discovery for " + ledType + " failed with error:" + error);
});
hwLedCountDefault = 1;
switch (ledType) {
case "sk6812spi":
case "sk6812_ftdi":
colorOrderDefault = "grb";
break;
default:
colorOrderDefault = "rgb";
}
break;
case "philipshue":
case "philipshue": {
disableAutoResolvedGeneralOptions();
var lights = conf_editor.getEditor("root.specificOptions.lightIds").getValue();
const lights = conf_editor.getEditor("root.specificOptions.lightIds").getValue();
hwLedCountDefault = lights.length;
colorOrderDefault = "rgb";
}
break;
case "yeelight":
case "yeelight": {
disableAutoResolvedGeneralOptions();
var lights = conf_editor.getEditor("root.specificOptions.lights").getValue();
const lights = conf_editor.getEditor("root.specificOptions.lights").getValue();
hwLedCountDefault = lights.length;
colorOrderDefault = "rgb";
}
break;
case "atmoorb":
case "atmoorb": {
disableAutoResolvedGeneralOptions();
var configruedOrbIds = conf_editor.getEditor("root.specificOptions.orbIds").getValue().trim();
const configruedOrbIds = conf_editor.getEditor("root.specificOptions.orbIds").getValue().trim();
if (configruedOrbIds.length !== 0) {
hwLedCountDefault = configruedOrbIds.split(",").map(Number).length;
} else {
hwLedCountDefault = 0;
}
colorOrderDefault = "rgb";
}
break;
case "razer":
case "razer": {
disableAutoResolvedGeneralOptions();
hwLedCountDefault = 1;
colorOrderDefault = "bgr";
var subType = conf_editor.getEditor("root.specificOptions.subType").getValue();
let params = { subType: subType };
const subType = conf_editor.getEditor("root.specificOptions.subType").getValue();
const params = { subType };
getProperties_device(ledType, subType, params);
}
break;
default:
}
if (ledType !== window.serverConfig.device.type) {
var hwLedCount = conf_editor.getEditor("root.generalOptions.hardwareLedCount");
let hwLedCount = conf_editor.getEditor("root.generalOptions.hardwareLedCount");
if (hwLedCount) {
hwLedCount.setValue(hwLedCountDefault);
}
var colorOrder = conf_editor.getEditor("root.generalOptions.colorOrder");
let colorOrder = conf_editor.getEditor("root.generalOptions.colorOrder");
if (colorOrder) {
colorOrder.setValue(colorOrderDefault);
}
@ -1213,8 +1204,8 @@ $(document).ready(function () {
conf_editor.on('change', function () {
// //Check, if device can be identified/tested and/or saved
var canIdentify = false;
var canSave = false;
let canIdentify = false;
let canSave = false;
switch (ledType) {
@ -1226,11 +1217,12 @@ $(document).ready(function () {
case "udpartnet":
case "udpddp":
case "udph801":
case "udpraw":
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
case "udpraw": {
const host = conf_editor.getEditor("root.specificOptions.host").getValue();
if (host !== "") {
canSave = true;
}
}
break;
case "adalight":
@ -1238,50 +1230,63 @@ $(document).ready(function () {
case "karate":
case "dmx":
case "sedu":
case "tpm2":
var rate = conf_editor.getEditor("root.specificOptions.rate").getValue();
case "tpm2": {
let currentDeviceType = window.serverConfig.device.type;
if ($.inArray(currentDeviceType, devSerial) === -1) {
canIdentify = true;
} else {
let output = conf_editor.getEditor("root.specificOptions.output").getValue();
if (window.serverConfig.device.output !== output) {
canIdentify = true;
}
}
const rate = conf_editor.getEditor("root.specificOptions.rate").getValue();
if (rate > 0) {
canSave = true;
}
}
break;
case "philipshue":
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
var username = conf_editor.getEditor("root.specificOptions.username").getValue();
case "philipshue": {
const host = conf_editor.getEditor("root.specificOptions.host").getValue();
const username = conf_editor.getEditor("root.specificOptions.username").getValue();
if (host !== "" && username != "") {
var useEntertainmentAPI = conf_editor.getEditor("root.specificOptions.useEntertainmentAPI").getValue();
var clientkey = conf_editor.getEditor("root.specificOptions.clientkey").getValue();
const useEntertainmentAPI = conf_editor.getEditor("root.specificOptions.useEntertainmentAPI").getValue();
const clientkey = conf_editor.getEditor("root.specificOptions.clientkey").getValue();
if (!useEntertainmentAPI || clientkey !== "") {
canSave = true;
}
}
}
break;
case "wled":
case "cololight":
var hostList = conf_editor.getEditor("root.specificOptions.hostList").getValue();
case "cololight": {
const hostList = conf_editor.getEditor("root.specificOptions.hostList").getValue();
if (hostList !== "SELECT") {
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
const host = conf_editor.getEditor("root.specificOptions.host").getValue();
if (host !== "") {
canIdentify = true;
canSave = true;
}
}
}
break;
case "nanoleaf":
var hostList = conf_editor.getEditor("root.specificOptions.hostList").getValue();
case "nanoleaf": {
const hostList = conf_editor.getEditor("root.specificOptions.hostList").getValue();
if (hostList !== "SELECT") {
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
var token = conf_editor.getEditor("root.specificOptions.token").getValue();
const host = conf_editor.getEditor("root.specificOptions.host").getValue();
const token = conf_editor.getEditor("root.specificOptions.token").getValue();
if (host !== "" && token !== "") {
canIdentify = true;
canSave = true;
}
}
}
break;
default:
canIdentify = false;
canSave = true;
}
@ -1365,6 +1370,13 @@ $(document).ready(function () {
if (host === "") {
conf_editor.getEditor("root.generalOptions.hardwareLedCount").setValue(1);
switch (ledType) {
case "nanoleaf":
$('#btn_wiz_holder').hide();
break;
default:
}
}
else {
let params = {};
@ -1376,6 +1388,8 @@ $(document).ready(function () {
break;
case "nanoleaf":
$('#btn_wiz_holder').show();
var token = conf_editor.getEditor("root.specificOptions.token").getValue();
if (token === "") {
return;
@ -1400,30 +1414,27 @@ $(document).ready(function () {
}
});
conf_editor.watch('root.specificOptions.output', () => {
var output = conf_editor.getEditor("root.specificOptions.output").getValue();
const output = conf_editor.getEditor("root.specificOptions.output").getValue();
if (output === "NONE" || output === "SELECT" || output === "") {
$('#btn_submit_controller').prop('disabled', true);
$('#btn_test_controller').prop('disabled', true);
$('#btn_test_controller').hide();
conf_editor.getEditor("root.generalOptions.hardwareLedCount").setValue(1);
showAllDeviceInputOptions("output", false);
}
else {
showAllDeviceInputOptions("output", true);
let params = {};
var canIdentify = false;
switch (ledType) {
case "adalight":
canIdentify = true;
break;
case "atmo":
case "karate":
params = { serialPort: output };
getProperties_device(ledType, output, params);
break;
case "adalight":
case "dmx":
case "sedu":
case "tpm2":
@ -1445,8 +1456,8 @@ $(document).ready(function () {
}
if ($.inArray(ledType, devSerial) != -1) {
var rateList = conf_editor.getEditor("root.specificOptions.rateList").getValue();
var showRate = false;
const rateList = conf_editor.getEditor("root.specificOptions.rateList").getValue();
let showRate = false;
if (rateList == "CUSTOM") {
showRate = true;
}
@ -1454,13 +1465,6 @@ $(document).ready(function () {
}
if (!conf_editor.validate().length) {
if (canIdentify) {
$("#btn_test_controller").show();
$('#btn_test_controller').prop('disabled', false);
} else {
$('#btn_test_controller').hide();
$('#btn_test_controller').prop('disabled', true);
}
if (!window.readOnlyMode) {
$('#btn_submit_controller').prop('disabled', false);
}
@ -1512,12 +1516,12 @@ $(document).ready(function () {
});
conf_editor.watch('root.specificOptions.rateList', () => {
var specOptPath = 'root.specificOptions.';
var rateList = conf_editor.getEditor("root.specificOptions.rateList");
if (rateList) {
var val = rateList.getValue();
var rate = conf_editor.getEditor("root.specificOptions.rate");
const specOptPath = 'root.specificOptions.';
const rateList = conf_editor.getEditor("root.specificOptions.rateList");
let rate = conf_editor.getEditor("root.specificOptions.rate");
if (rateList) {
const val = rateList.getValue();
switch (val) {
case 'CUSTOM':
case '':
@ -1701,6 +1705,33 @@ $(document).ready(function () {
$("#leddevices").val(window.serverConfig.device.type);
$("#leddevices").trigger("change");
// Generate layout for LED-Device
$("#btn_layout_controller").off().on("click", function () {
var ledType = $("#leddevices").val();
var isGenerated = false;
switch (ledType) {
case "nanoleaf":
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
var ledDeviceProperties = devicesProperties[ledType][host];
if (ledDeviceProperties) {
var panelOrderTopDown = conf_editor.getEditor("root.specificOptions.panelOrderTopDown").getValue() === "top2down";
var panelOrderLeftRight = conf_editor.getEditor("root.specificOptions.panelOrderLeftRight").getValue() === "left2right";
var ledArray = nanoleafGeneratelayout(ledDeviceProperties.panelLayout, panelOrderTopDown, panelOrderLeftRight);
aceEdt.set(ledArray);
isGenerated = true;
}
break;
default:
}
if (isGenerated) {
showInfoDialog('success', "", $.i18n('conf_leds_layout_generation_success'));
} else {
showInfoDialog('error', "", $.i18n('conf_leds_layout_generation_error'));
}
});
// Identify/ Test LED-Device
$("#btn_test_controller").off().on("click", function () {
var ledType = $("#leddevices").val();
@ -2155,7 +2186,7 @@ var updateOutputSelectList = function (ledType, discoveryInfo) {
case "devRPiPWM":
key = ledType;
if (discoveryInfo.devices.length == 0) {
if (!discoveryInfo.isUserAdmin) {
enumVals.push("NONE");
enumTitleVals.push($.i18n('edt_dev_spec_devices_discovered_none'));
$('#btn_submit_controller').prop('disabled', true);
@ -2240,6 +2271,7 @@ async function identify_device(type, params) {
}
function updateElements(ledType, key) {
var canLayout = false;
if (devicesProperties[ledType][key]) {
var hardwareLedCount = 1;
switch (ledType) {
@ -2258,18 +2290,11 @@ function updateElements(ledType, key) {
case "nanoleaf":
var ledProperties = devicesProperties[ledType][key];
if (ledProperties && ledProperties.panelLayout.layout) {
//Identify non-LED type panels, e.g. Rhythm (1) and Shapes Controller (12)
var nonLedNum = 0;
for (const panel of ledProperties.panelLayout.layout.positionData) {
if (panel.shapeType === 1 || panel.shapeType === 12) {
nonLedNum++;
}
}
hardwareLedCount = ledProperties.panelLayout.layout.numPanels - nonLedNum;
if (ledProperties) {
hardwareLedCount = ledProperties.ledCount;
canLayout = true;
}
conf_editor.getEditor("root.generalOptions.hardwareLedCount").setValue(hardwareLedCount);
break;
case "udpraw":
@ -2318,11 +2343,19 @@ function updateElements(ledType, key) {
}
if (!conf_editor.validate().length) {
if (canLayout) {
$("#btn_layout_controller").show();
$('#btn_layout_controller').prop('disabled', false);
} else {
$('#btn_layout_controller').hide();
}
if (!window.readOnlyMode) {
$('#btn_submit_controller').attr('disabled', false);
}
}
else {
$('#btn_layout_controller').prop('disabled', true);
$('#btn_submit_controller').attr('disabled', true);
}
}
@ -2416,6 +2449,7 @@ function updateElementsWled(ledType, key) {
var enumSegSelectVals = [];
var enumSegSelectTitleVals = [];
var enumSegSelectDefaultVal = "";
var defaultSegmentId = "-1";
if (devicesProperties[ledType] && devicesProperties[ledType][key]) {
var ledDeviceProperties = devicesProperties[ledType][key];
@ -2423,9 +2457,8 @@ function updateElementsWled(ledType, key) {
if (!jQuery.isEmptyObject(ledDeviceProperties)) {
if (ledDeviceProperties.info) {
if (ledDeviceProperties.info.liveseg && ledDeviceProperties.info.liveseg < 0) {
if (!ledDeviceProperties.info.hasOwnProperty("liveseg") || ledDeviceProperties.info.liveseg < 0) {
// "Use main segment only" is disabled
var defaultSegmentId = "-1";
enumSegSelectVals.push(defaultSegmentId);
enumSegSelectTitleVals.push($.i18n('edt_dev_spec_segments_disabled_title'));
enumSegSelectDefaultVal = defaultSegmentId;
@ -2477,13 +2510,12 @@ function updateElementsWled(ledType, key) {
hardwareLedCount = 1;
}
if (segmentConfig) {
if (segmentConfig && segmentConfig.streamSegmentId > defaultSegmentId) {
var configuredstreamSegmentId = window.serverConfig.device.segments.streamSegmentId.toString();
enumSegSelectVals = [configuredstreamSegmentId];
enumSegSelectTitleVals = ["Segment " + configuredstreamSegmentId];
enumSegSelectDefaultVal = configuredstreamSegmentId;
} else {
defaultSegmentId = "-1";
enumSegSelectVals.push(defaultSegmentId);
enumSegSelectTitleVals.push($.i18n('edt_dev_spec_segments_disabled_title'));
enumSegSelectDefaultVal = defaultSegmentId;
@ -2501,4 +2533,153 @@ function updateElementsWled(ledType, key) {
}
showInputOptionForItem(conf_editor, "root.specificOptions.segments", "switchOffOtherSegments", showAdditionalOptions);
}
function sortByPanelCoordinates(arr, topToBottom, leftToRight) {
arr.sort((a, b) => {
//Nanoleaf corodinates start at bottom left, therefore reverse topToBottom
if (!topToBottom) {
if (a.y === b.y) {
if (leftToRight) {
return a.x - b.x;
} else {
return b.x - a.x;
}
} else {
return a.y - b.y;
}
}
else {
if (a.y === b.y) {
if (leftToRight) {
return a.x - b.x;
} else {
return b.x - a.x;
}
} else {
return b.y - a.y;
}
}
});
}
function rotateCoordinates(x, y, radians) {
var rotatedX = x * Math.cos(radians) - y * Math.sin(radians);
var rotatedY = x * Math.sin(radians) + y * Math.cos(radians);
return { x: rotatedX, y: rotatedY };
}
function nanoleafGeneratelayout(panelLayout, panelOrderTopDown, panelOrderLeftRight) {
// Dictionary for Nanoleaf shape types
let shapeTypes = {
0: { name: "LightsTriangle", led: true, sideLengthX: 150, sideLengthY: 150 },
1: { name: "LightsRythm", led: false, sideLengthX: 0, sideLengthY: 0 },
2: { name: "Square", led: true, sideLengthX: 100, sideLengthY: 100 },
3: { name: "SquareControllerMaster", led: true, sideLengthX: 100, sideLengthY: 100 },
4: { name: "SquareControllerPassive", led: true, sideLengthX: 100, sideLengthY: 100 },
5: { name: "PowerSupply", led: true, sideLengthX: 100, sideLengthY: 100 },
7: { name: "ShapesHexagon", led: true, sideLengthX: 67, sideLengthY: 67 },
8: { name: "ShapesTriangle", led: true, sideLengthX: 134, sideLengthY: 134 },
9: { name: "ShapesMiniTriangle", led: true, sideLengthX: 67, sideLengthY: 67 },
12: { name: "ShapesController", led: false, sideLengthX: 0, sideLengthY: 0 },
14: { name: "ElementsHexagon", led: true, sideLengthX: 134, sideLengthY: 134 },
15: { name: "ElementsHexagonCorner", led: true, sideLengthX: 33.5, sideLengthY: 58 },
16: { name: "LinesConnector", led: false, sideLengthX: 11, sideLengthY: 11 },
17: { name: "LightLines", led: true, sideLengthX: 154, sideLengthY: 154 },
18: { name: "LightLinesSingleZone", led: true, sideLengthX: 77, sideLengthY: 77 },
19: { name: "ControllerCap", led: false, sideLengthX: 11, sideLengthY: 11 },
20: { name: "PowerConnector", led: false, sideLengthX: 11, sideLengthY: 11 },
29: { name: "4DLightstrip", led: true, sideLengthX: 50, sideLengthY: 50 },
30: { name: "Skylight Panel", led: true, sideLengthX: 180, sideLengthY: 180 },
31: { name: "SkylightControllerPrimary", led: true, sideLengthX: 180, sideLengthY: 180 },
32: { name: "SkylightControllerPassive", led: true, sideLengthX: 180, sideLengthY: 180 },
999: { name: "Unknown", led: true, sideLengthX: 100, sideLengthY: 100 }
};
let { globalOrientation, layout } = panelLayout;
var degreesToRotate = 0;
if (globalOrientation) {
degreesToRotate = globalOrientation.value;
}
//Align rotation degree to 15 degree steps
const degreeSteps = 15;
var degreeRounded = ((Math.round(degreesToRotate / degreeSteps) * degreeSteps) + 360) % 360;
//Nanoleaf orientation is counter-clockwise
degreeRounded *= -1;
// Convert degrees to radians
const radians = (degreeRounded * Math.PI) / 180;
//Reduce the capture area
const areaSizeFactor = 0.5;
var panelDataXY = [...layout.positionData];
panelDataXY.forEach(panel => {
if (shapeTypes[panel.shapeType] == undefined) {
panel.shapeType = 999;
}
panel.shapeName = shapeTypes[panel.shapeType].name;
panel.led = shapeTypes[panel.shapeType].led;
panel.areaWidth = shapeTypes[panel.shapeType].sideLengthX * areaSizeFactor;
panel.areaHeight = shapeTypes[panel.shapeType].sideLengthY * areaSizeFactor;
if (radians !== 0) {
var rotatedXY = rotateCoordinates(panel.x, panel.y, radians);
panel.x = Math.round(rotatedXY.x);
panel.y = Math.round(rotatedXY.y);
}
panel.maxX = panel.x + panel.areaWidth;
panel.maxY = panel.y + panel.areaHeight;
});
var minX = panelDataXY[0].x;
var maxX = panelDataXY[0].x;
var minY = panelDataXY[0].y;
var maxY = panelDataXY[0].y;
panelDataXY.forEach(panel => {
if (panel.maxX > maxX) {
maxX = panel.maxX;
}
if (panel.x < minX) {
minX = panel.x;
}
if (panel.maxY > maxY) {
maxY = panel.maxY;
}
if (panel.y < minY) {
minY = panel.y;
}
});
const width = Math.abs(maxX - minX);
const height = Math.abs(maxY - minY);
const scaleX = 1 / width;
const scaleY = 1 / height;
var layoutObjects = [];
var i = 0;
sortByPanelCoordinates(panelDataXY, panelOrderTopDown, panelOrderLeftRight);
panelDataXY.forEach(panel => {
if (panel.led) {
let layoutObject = {
name: i + "-" + panel.panelId,
hmin: Math.min(1, Math.max(0, (panel.x - minX) * scaleX)),
hmax: Math.min(1, Math.max(0, (panel.x - minX + panel.areaWidth) * scaleX)),
//Nanoleaf corodinates start at bottom left, therefore reverse vertical positioning
vmax: (1 - Math.min(1, Math.max(0, (panel.y - minY) * scaleY))),
vmin: (1 - Math.min(1, Math.max(0, (panel.y - minY + panel.areaHeight) * scaleY)))
};
layoutObjects.push(JSON.parse(JSON.stringify(layoutObject)));
++i;
}
});
return layoutObjects;
}

View File

@ -3,10 +3,13 @@ var createdCont = false;
var isScroll = true;
performTranslation();
requestLoggingStop();
$(document).ready(function () {
window.addEventListener('hashchange', function(event) {
requestLoggingStop();
});
requestLoggingStart();
$('#conf_cont').append(createOptPanel('fa-reorder', $.i18n("edt_conf_log_heading_title"), 'editor_container', 'btn_submit'));
@ -178,9 +181,9 @@ $(document).ready(function () {
if (!window.loggingHandlerInstalled) {
window.loggingHandlerInstalled = true;
$(window.hyperion).on("cmd-logging-update", function (event) {
$(window.hyperion).on("cmd-logmsg-update", function (event) {
var messages = (event.response.result.messages);
var messages = (event.response.data.messages);
if (messages.length != 0) {
if (!createdCont) {

View File

@ -213,13 +213,13 @@ $(document).ready(function () {
for (var key in tokenList) {
var lastUse = (tokenList[key].last_use) ? tokenList[key].last_use : "-";
var btn = '<button id="tok' + tokenList[key].id + '" type="button" class="btn btn-danger">' + $.i18n('general_btn_delete') + '</button>';
$('.tktbody').append(createTableRow([tokenList[key].comment, lastUse, btn], false, true));
$('.tktbody').append(createTableRow([tokenList[key].id, tokenList[key].comment, lastUse, btn], false, true));
$('#tok' + tokenList[key].id).off().on('click', handleDeleteToken);
}
}
createTable('tkthead', 'tktbody', 'tktable');
$('.tkthead').html(createTableRow([$.i18n('conf_network_tok_cidhead'), $.i18n('conf_network_tok_lastuse'), $.i18n('general_btn_delete')], true, true));
$('.tkthead').html(createTableRow([$.i18n('conf_network_tok_idhead'), $.i18n('conf_network_tok_cidhead'), $.i18n('conf_network_tok_lastuse'), $.i18n('general_btn_delete')], true, true));
buildTokenList();
function handleDeleteToken(e) {

View File

@ -177,6 +177,7 @@ function sendToHyperion(command, subcommand, msg)
else
msg = "";
window.wsTan = Math.floor(Math.random() * 1000)
window.websocket.send('{"command":"'+command+'", "tan":'+window.wsTan+subcommand+msg+'}');
}
@ -187,7 +188,7 @@ function sendToHyperion(command, subcommand, msg)
// data: The json data as Object
// tan: The optional tan, default 1. If the tan is -1, we skip global response error handling
// Returns data of response or false if timeout
async function sendAsyncToHyperion (command, subcommand, data, tan = 1) {
async function sendAsyncToHyperion (command, subcommand, data, tan = Math.floor(Math.random() * 1000) ) {
let obj = { command, tan }
if (subcommand) {Object.assign(obj, {subcommand})}
if (data) { Object.assign(obj, data) }
@ -486,38 +487,38 @@ async function requestLedDeviceDiscovery(type, params)
{
let data = { ledDeviceType: type, params: params };
return sendAsyncToHyperion("leddevice", "discover", data, Math.floor(Math.random() * 1000) );
return sendAsyncToHyperion("leddevice", "discover", data);
}
async function requestLedDeviceProperties(type, params)
{
let data = { ledDeviceType: type, params: params };
return sendAsyncToHyperion("leddevice", "getProperties", data, Math.floor(Math.random() * 1000));
return sendAsyncToHyperion("leddevice", "getProperties", data);
}
function requestLedDeviceIdentification(type, params)
{
let data = { ledDeviceType: type, params: params };
return sendAsyncToHyperion("leddevice", "identify", data, Math.floor(Math.random() * 1000));
return sendAsyncToHyperion("leddevice", "identify", data);
}
async function requestLedDeviceAddAuthorization(type, params) {
let data = { ledDeviceType: type, params: params };
return sendAsyncToHyperion("leddevice", "addAuthorization", data, Math.floor(Math.random() * 1000));
return sendAsyncToHyperion("leddevice", "addAuthorization", data);
}
async function requestInputSourcesDiscovery(type, params) {
let data = { sourceType: type, params: params };
return sendAsyncToHyperion("inputsource", "discover", data, Math.floor(Math.random() * 1000));
return sendAsyncToHyperion("inputsource", "discover", data);
}
async function requestServiceDiscovery(type, params) {
let data = { serviceType: type, params: params };
return sendAsyncToHyperion("service", "discover", data, Math.floor(Math.random() * 1000));
return sendAsyncToHyperion("service", "discover", data);
}

View File

@ -1,6 +1,6 @@
var storedLang;
var availLang = ['ca', 'cs', 'da', 'de', 'el', 'en', 'es', 'fr', 'hu', 'it', 'ja', 'nl', 'nb', 'pl', 'pt', 'ro', 'sv', 'vi', 'ru', 'tr', 'zh-CN'];
var availLangText = ['Català', 'Čeština', 'Dansk', 'Deutsch', 'Ελληνική', 'English', 'Español', 'Français', 'Magyar', 'Italiano', '日本語', 'Nederlands', 'Norsk Bokmål', 'Polski', 'Português', 'Română', 'Svenska', 'Tiếng Việt', 'русский', 'Türkçe', '汉语'];
var availLang = ['bg', 'ca', 'cs', 'da', 'de', 'el', 'en', 'es', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'nl', 'nb', 'pl', 'pt', 'ro', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh-CN'];
var availLangText = ['Български', 'Català', 'Čeština', 'Dansk', 'Deutsch', 'Ελληνική', 'English', 'Español', 'Français', 'עִברִית' ,'Magyar', 'Indonesia', 'Italiano', '日本語', 'Nederlands', 'Norsk Bokmål', 'Polski', 'Português', 'Română', 'русский', 'Svenska', 'Türkçe', 'Українська', 'Tiếng Việt', '汉语'];
//$.i18n.debug = true;

View File

@ -261,7 +261,7 @@ $(document).ready(function () {
$("body").get(0).style.setProperty("--background-var", "none");
}
else {
printLedsToCanvas(event.response.result.leds)
printLedsToCanvas(event.response.data.leds)
$("body").get(0).style.setProperty("--background-var", "url(" + ($('#leds_preview_canv')[0]).toDataURL("image/jpg") + ") no-repeat top left");
}
});
@ -275,7 +275,7 @@ $(document).ready(function () {
}
}
else {
var imageData = (event.response.result.image);
var imageData = (event.response.data.image);
var image = new Image();
image.onload = function () {

View File

@ -319,9 +319,9 @@ function showInfoDialog(type, header, message) {
});
$(document).on('click', '[data-dismiss-modal]', function () {
var target = $(this).attr('data-dismiss-modal');
$.find(target).modal('hide');
});
var target = $(this).data('dismiss-modal');
$($.find(target)).modal('hide');
});
}
function createHintH(type, text, container) {
@ -1224,6 +1224,7 @@ function getSystemInfo() {
info += '- Avail Services: ' + window.serverInfo.services + '\n';
info += '- Config path: ' + shy.rootPath + '\n';
info += '- Database: ' + (shy.readOnlyMode ? "ready-only" : "read/write") + '\n';
info += '- Mode: ' + (shy.isGuiMode ? "GUI" : "Non-GUI") + '\n';
info += '\n';
@ -1392,3 +1393,32 @@ function isValidHostnameOrIP(value) {
return (isValidHostnameOrIP4(value) || isValidIPv6(value) || isValidServicename(value));
}
const loadedScripts = [];
function isScriptLoaded(src) {
return loadedScripts.indexOf(src) > -1;
}
function loadScript(src, callback, ...params) {
if (isScriptLoaded(src)) {
debugMessage('Script ' + src + ' already loaded');
if (callback && typeof callback === 'function') {
callback( ...params);
}
return;
}
const script = document.createElement('script');
script.src = src;
script.onload = function () {
debugMessage('Script ' + src + ' loaded successfully');
loadedScripts.push(src);
if (callback && typeof callback === 'function') {
callback(...params);
}
};
document.head.appendChild(script);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,283 @@
//****************************
// Wizard AtmoOrb
//****************************
import { ledDeviceWizardUtils as utils } from './LedDevice_utils.js';
const atmoorbWizard = (() => {
const lights = [];
let configuredLights = [];
function getIdInLights(id) {
return lights.filter(
function (lights) {
return lights.id === id
}
);
}
function begin() {
const configruedOrbIds = conf_editor.getEditor("root.specificOptions.orbIds").getValue().trim();
if (configruedOrbIds.length !== 0) {
configuredLights = configruedOrbIds.split(",").map(Number);
}
const multiCastGroup = conf_editor.getEditor("root.specificOptions.host").getValue();
const multiCastPort = parseInt(conf_editor.getEditor("root.specificOptions.port").getValue());
discover(multiCastGroup, multiCastPort);
$('#btn_wiz_save').off().on("click", function () {
let ledConfig = [];
let finalLights = [];
//create atmoorb led config
for (let key in lights) {
if ($('#orb_' + key).val() !== "disabled") {
// Set Name to layout-position, if empty
if (lights[key].name === "") {
lights[key].name = $.i18n('conf_leds_layout_cl_' + $('#orb_' + key).val());
}
finalLights.push(lights[key].id);
let name = lights[key].id;
if (lights[key].host !== "")
name += ':' + lights[key].host;
const idx_content = utils.assignLightPos($('#orb_' + key).val(), name);
ledConfig.push(JSON.parse(JSON.stringify(idx_content)));
}
}
//LED layout
window.serverConfig.leds = ledConfig;
//LED device config
//Start with a clean configuration
let d = {};
d.type = 'atmoorb';
d.hardwareLedCount = finalLights.length;
d.colorOrder = conf_editor.getEditor("root.generalOptions.colorOrder").getValue();
d.orbIds = finalLights.toString();
d.useOrbSmoothing = utils.eV("useOrbSmoothing");
d.host = conf_editor.getEditor("root.specificOptions.host").getValue();
d.port = parseInt(conf_editor.getEditor("root.specificOptions.port").getValue());
d.latchTime = parseInt(conf_editor.getEditor("root.specificOptions.latchTime").getValue());;
window.serverConfig.device = d;
requestWriteConfig(window.serverConfig, true);
resetWizard();
});
$('#btn_wiz_abort').off().on('click', resetWizard);
}
async function discover(multiCastGroup, multiCastPort) {
let params = {};
if (multiCastGroup !== "") {
params.multiCastGroup = multiCastGroup;
}
if (multiCastPort !== 0) {
params.multiCastPort = multiCastPort;
}
// Get discovered lights
const res = await requestLedDeviceDiscovery('atmoorb', params);
if (res && !res.error) {
const r = res.info;
// Process devices returned by discovery
processDiscoveredDevices(r.devices);
// Add additional items from configuration
for (const configuredLight of configuredLights) {
processConfiguredLight(configuredLight);
}
sortLightsById();
assign_lights();
}
}
function processDiscoveredDevices(devices) {
for (const device of devices) {
if (device.id !== "" && getIdInLights(device.id).length === 0) {
const light = {
id: device.id,
ip: device.ip,
host: device.hostname
};
lights.push(light);
}
}
}
function processConfiguredLight(configuredLight) {
if (configuredLight !== "" && !isNaN(configuredLight)) {
if (getIdInLights(configuredLight).length === 0) {
const light = {
id: configuredLight,
ip: "",
host: ""
};
lights.push(light);
}
}
}
function attachIdentifyButtonEvent() {
// Use event delegation to handle clicks on buttons with class "btn-identify"
$('#wizp2_body').on('click', '.btn-identify', function () {
const orbId = $(this).data('orb-id');
identify(orbId);
});
}
function sortLightsById() {
lights.sort((a, b) => (a.id > b.id) ? 1 : -1);
}
function assign_lights() {
// If records are left for configuration
if (Object.keys(lights).length > 0) {
$('#wh_topcontainer').toggle(false);
$('#orb_ids_t, #btn_wiz_save').toggle(true);
const lightOptions = [
"top", "topleft", "topright",
"bottom", "bottomleft", "bottomright",
"left", "lefttop", "leftmiddle", "leftbottom",
"right", "righttop", "rightmiddle", "rightbottom",
"entire",
"lightPosTopLeft112", "lightPosTopLeftNewMid", "lightPosTopLeft121",
"lightPosBottomLeft14", "lightPosBottomLeft12", "lightPosBottomLeft34", "lightPosBottomLeft11",
"lightPosBottomLeft112", "lightPosBottomLeftNewMid", "lightPosBottomLeft121"
];
lightOptions.unshift("disabled");
$('.lidsb').html("");
let pos = "";
for (const lightid in lights) {
const orbId = lights[lightid].id;
const orbIp = lights[lightid].ip;
let orbHostname = lights[lightid].host;
if (orbHostname === "")
orbHostname = $.i18n('edt_dev_spec_lights_itemtitle');
let options = "";
for (const opt in lightOptions) {
const val = lightOptions[opt];
const txt = (val !== 'entire' && val !== 'disabled') ? 'conf_leds_layout_cl_' : 'wiz_ids_';
options += '<option value="' + val + '"';
if (pos === val) options += ' selected="selected"';
options += '>' + $.i18n(txt + val) + '</option>';
}
let enabled = 'enabled';
if (orbId < 1 || orbId > 255) {
enabled = 'disabled';
options = '<option value=disabled>' + $.i18n('wiz_atmoorb_unsupported') + '</option>';
}
let lightAnnotation = "";
if (orbIp !== "") {
lightAnnotation = ': ' + orbIp + '<br>(' + orbHostname + ')';
}
$('.lidsb').append(createTableRow([orbId + lightAnnotation, '<select id="orb_' + lightid + '" ' + enabled + ' class="orb_sel_watch form-control">'
+ options
+ '</select>', '<button class="btn btn-sm btn-primary btn-identify" ' + enabled + ' data-orb-id="' + orbId + '")>'
+ $.i18n('wiz_identify_light', orbId) + '</button>']));
}
attachIdentifyButtonEvent();
$('.orb_sel_watch').on("change", function () {
let cC = 0;
for (const key in lights) {
if ($('#orb_' + key).val() !== "disabled") {
cC++;
}
}
if (cC === 0 || window.readOnlyMode)
$('#btn_wiz_save').prop("disabled", true);
else
$('#btn_wiz_save').prop("disabled", false);
});
$('.orb_sel_watch').trigger('change');
}
else {
const noLightsTxt = '<p style="font-weight:bold;color:red;">' + $.i18n('wiz_noLights', 'AtmoOrbs') + '</p>';
$('#wizp2_body').append(noLightsTxt);
}
}
async function identify(orbId) {
const disabled = $('#btn_wiz_save').is(':disabled');
// Take care that new record cannot be save during background process
$('#btn_wiz_save').prop('disabled', true);
const params = { id: orbId };
await requestLedDeviceIdentification("atmoorb", params);
if (!window.readOnlyMode) {
$('#btn_wiz_save').prop('disabled', disabled);
}
}
return {
start: function (e) {
//create html
const atmoorb_title = 'wiz_atmoorb_title';
const atmoorb_intro1 = 'wiz_atmoorb_intro1';
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>' + $.i18n(atmoorb_title));
$('#wizp1_body').html('<h4 style="font-weight:bold;text-transform:uppercase;">' + $.i18n(atmoorb_title) + '</h4><p>' + $.i18n(atmoorb_intro1) + '</p>');
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>'
+ $.i18n('general_btn_continue') + '</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>'
+ $.i18n('general_btn_cancel') + '</button>');
$('#wizp2_body').html('<div id="wh_topcontainer"></div>');
$('#wh_topcontainer').append('<div class="form-group" id="usrcont" style="display:none"></div>');
$('#wizp2_body').append('<div id="orb_ids_t" style="display:none"><p style="font-weight:bold" id="orb_id_headline">' + $.i18n('wiz_atmoorb_desc2') + '</p></div>');
createTable("lidsh", "lidsb", "orb_ids_t");
$('.lidsh').append(createTableRow([$.i18n('edt_dev_spec_lights_title'), $.i18n('wiz_pos'), $.i18n('wiz_identify')], true));
$('#wizp2_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_save" style="display:none"><i class="fa fa-fw fa-save"></i>'
+ $.i18n('general_btn_save') + '</button><buttowindow.serverConfig.device = d;n type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>'
+ $.i18n('general_btn_cancel') + '</button>');
if (getStorage("darkMode") == "on")
$('#wizard_logo').attr("src", 'img/hyperion/logo_negativ.png');
//open modal
$("#wizard_modal").modal({ backdrop: "static", keyboard: false, show: true });
//listen for continue
$('#btn_wiz_cont').off().on('click', function () {
begin();
$('#wizp1').toggle(false);
$('#wizp2').toggle(true);
});
}
};
})();
export { atmoorbWizard };

View File

@ -0,0 +1,94 @@
//****************************
// Wizard Nanoleaf
//****************************
const nanoleafWizard = (() => {
const retryInterval = 2;
async function createNanoleafUserAuthorization() {
const host = conf_editor.getEditor("root.specificOptions.host").getValue();
const params = { host };
let retryTime = 30;
const UserInterval = setInterval(async function () {
retryTime -= retryInterval;
$("#connectionTime").html(retryTime);
if (retryTime <= 0) {
handleTimeout();
} else {
const res = await requestLedDeviceAddAuthorization('nanoleaf', params);
handleResponse(res);
}
}, retryInterval * 1000);
function handleTimeout() {
clearInterval(UserInterval);
showNotification(
'warning',
$.i18n('wiz_nanoleaf_failure_auth_token'),
$.i18n('wiz_nanoleaf_failure_auth_token_t')
);
resetWizard(true);
}
function handleResponse(res) {
if (res && !res.error) {
const response = res.info;
if (jQuery.isEmptyObject(response)) {
debugMessage(`${retryTime}: Power On/Off button not pressed or device not reachable`);
} else {
const token = response.auth_token;
if (token !== 'undefined') {
conf_editor.getEditor("root.specificOptions.token").setValue(token);
}
clearInterval(UserInterval);
resetWizard(true);
}
} else {
clearInterval(UserInterval);
resetWizard(true);
}
}
}
return {
start: function () {
const nanoleaf_user_auth_title = 'wiz_nanoleaf_user_auth_title';
const nanoleaf_user_auth_intro = 'wiz_nanoleaf_user_auth_intro';
$('#wiz_header').html(
`<i class="fa fa-magic fa-fw"></i>${$.i18n(nanoleaf_user_auth_title)}`
);
$('#wizp1_body').html(
`<h4 style="font-weight:bold;text-transform:uppercase;">${$.i18n(nanoleaf_user_auth_title)}</h4><p>${$.i18n(nanoleaf_user_auth_intro)}</p>`
);
$('#wizp1_footer').html(
`<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>${$.i18n('general_btn_continue')}</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>${$.i18n('general_btn_cancel')}</button>`
);
$('#wizp3_body').html(
`<span>${$.i18n('wiz_nanoleaf_press_onoff_button')}</span> <br /><br /><center><span id="connectionTime"></span><br /><i class="fa fa-cog fa-spin" style="font-size:100px"></i></center>`
);
if (getStorage("darkMode") == "on") {
$('#wizard_logo').attr("src", 'img/hyperion/logo_negativ.png');
}
$("#wizard_modal").modal({
backdrop: "static",
keyboard: false,
show: true
});
$('#btn_wiz_cont').off().on('click', function () {
createNanoleafUserAuthorization();
$('#wizp1').toggle(false);
$('#wizp3').toggle(true);
});
}
};
})();
export { nanoleafWizard };

View File

@ -0,0 +1,996 @@
//****************************
// Wizard Philips Hue
//****************************
import { ledDeviceWizardUtils as utils } from './LedDevice_utils.js';
const philipshueWizard = (() => {
// External properties, 2-dimensional arry of [ledType][key]
let devicesProperties = {};
let hueIPs = [];
let hueIPsinc = 0;
let hueLights = [];
let hueEntertainmentConfigs = [];
let hueEntertainmentServices = [];
let groupLights = [];
let groupChannels = [];
let groupLightsLocations = [];
let isAPIv2Ready = true;
let isEntertainmentReady = true;
function checkHueBridge(cb, hueUser) {
const usr = (typeof hueUser != "undefined") ? hueUser : 'config';
if (usr === 'config') {
$('#wiz_hue_discovered').html("");
}
if (hueIPs[hueIPsinc]) {
const host = hueIPs[hueIPsinc].host;
const port = hueIPs[hueIPsinc].port;
if (usr != '') {
getProperties(cb, decodeURIComponent(host), port, usr);
}
else {
cb(false, usr);
}
if (isAPIv2Ready) {
$('#port').val(443);
}
}
}
function checkBridgeResult(reply, usr) {
if (reply) {
//abort checking, first reachable result is used
$('#wiz_hue_ipstate').html("");
$('#host').val(hueIPs[hueIPsinc].host)
$('#port').val(hueIPs[hueIPsinc].port)
$('#usrcont').toggle(true);
checkHueBridge(checkUserResult, $('#user').val());
}
else {
$('#usrcont').toggle(false);
$('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip'));
}
};
function checkUserResult(reply, username) {
$('#usrcont').toggle(true);
let hue_create_user = 'wiz_hue_e_create_user';
if (!isEntertainmentReady) {
hue_create_user = 'wiz_hue_create_user';
$('#hue_client_key_r').toggle(false);
} else {
$('#hue_client_key_r').toggle(true);
}
$('#wiz_hue_create_user').text($.i18n(hue_create_user));
$('#wiz_hue_create_user').toggle(true);
if (reply) {
$('#user').val(username);
if (isEntertainmentReady && $('#clientkey').val() == "") {
$('#wiz_hue_usrstate').html($.i18n('wiz_hue_e_clientkey_needed'));
$('#wiz_hue_create_user').toggle(true);
} else {
$('#wiz_hue_usrstate').html("");
$('#wiz_hue_create_user').toggle(false);
if (isEntertainmentReady) {
$('#hue_id_headline').text($.i18n('wiz_hue_e_desc3'));
$('#hue_grp_ids_t').toggle(true);
get_hue_groups(username);
} else {
$('#hue_id_headline').text($.i18n('wiz_hue_desc2'));
$('#hue_grp_ids_t').toggle(false);
get_hue_lights(username);
}
}
}
else {
//abort checking, first reachable result is used
$('#wiz_hue_usrstate').html($.i18n('wiz_hue_failure_user'));
$('#wiz_hue_create_user').toggle(true);
}
};
function useGroupId(id, username) {
$('#groupId').val(hueEntertainmentConfigs[id].id);
if (isAPIv2Ready) {
const group = hueEntertainmentConfigs[id];
groupLights = [];
for (const light of group.light_services) {
groupLights.push(light.rid);
}
groupChannels = [];
for (const channel of group.channels) {
groupChannels.push(channel);
}
groupLightsLocations = [];
for (const location of group.locations.service_locations) {
groupLightsLocations.push(location);
}
} else {
//Ensure ligthIDs are strings
groupLights = hueEntertainmentConfigs[id].lights.map(num => {
return String(num);
});
const lightLocations = hueEntertainmentConfigs[id].locations;
for (const locationID in lightLocations) {
let lightLocation = {};
let position = {
x: lightLocations[locationID][0],
y: lightLocations[locationID][1],
z: lightLocations[locationID][2]
};
lightLocation.position = position;
groupLightsLocations.push(lightLocation);
}
}
get_hue_lights(username);
}
function assignLightEntertainmentPos(isFocusCenter, position, name, id) {
let x = position.x;
let z = position.z;
if (isFocusCenter) {
// Map lights as in centered range -0.5 to 0.5
if (x < -0.5) {
x = -0.5;
} else if (x > 0.5) {
x = 0.5;
}
if (z < -0.5) {
z = -0.5;
} else if (z > 0.5) {
z = 0.5;
}
} else {
// Map lights as in full range -1 to 1
x /= 2;
z /= 2;
}
const h = x + 0.5;
const v = -z + 0.5;
const hmin = h - 0.05;
const hmax = h + 0.05;
const vmin = v - 0.05;
const vmax = v + 0.05;
let layoutObject = {
hmin: hmin < 0 ? 0 : hmin,
hmax: hmax > 1 ? 1 : hmax,
vmin: vmin < 0 ? 0 : vmin,
vmax: vmax > 1 ? 1 : vmax,
name: name
};
if (id !== undefined && id !== null) {
layoutObject.name += "_" + id;
}
return layoutObject;
}
function assignSegmentedLightPos(segment, position, name) {
let layoutObjects = [];
let segTotalLength = 0;
for (const key in segment) {
segTotalLength += segment[key].length;
}
let min;
let max;
let horizontal = true;
let layoutObject = utils.assignLightPos(position, name);
if (position === "left" || position === "right") {
// vertical distribution
min = layoutObject.vmin;
max = layoutObject.vmax;
horizontal = false;
} else {
// horizontal distribution
min = layoutObject.hmin;
max = layoutObject.hmax;
}
const step = (max - min) / segTotalLength;
let start = min;
for (const key in segment) {
min = start;
max = round(start + segment[key].length * step);
if (horizontal) {
layoutObject.hmin = min;
layoutObject.hmax = max;
} else {
layoutObject.vmin = min;
layoutObject.vmax = max;
}
layoutObject.name = name + "_" + key;
layoutObjects.push(JSON.parse(JSON.stringify(layoutObject)));
start = max;
}
return layoutObjects;
}
function updateBridgeDetails(properties) {
const ledDeviceProperties = properties.config;
if (!jQuery.isEmptyObject(ledDeviceProperties)) {
isEntertainmentReady = properties.isEntertainmentReady;
isAPIv2Ready = properties.isAPIv2Ready;
if (ledDeviceProperties.name && ledDeviceProperties.bridgeid && ledDeviceProperties.modelid) {
$('#wiz_hue_discovered').html(
"Bridge: " + ledDeviceProperties.name +
", Modelid: " + ledDeviceProperties.modelid +
", Firmware: " + ledDeviceProperties.swversion + "<br/>" +
"API-Version: " + ledDeviceProperties.apiversion +
", Entertainment: " + (isEntertainmentReady ? "&#10003;" : "-") +
", APIv2: " + (isAPIv2Ready ? "&#10003;" : "-")
);
}
}
}
async function discover() {
$('#wiz_hue_ipstate').html($.i18n('edt_dev_spec_devices_discovery_inprogress'));
// $('#wiz_hue_discovered').html("")
const res = await requestLedDeviceDiscovery('philipshue');
if (res && !res.error) {
const r = res.info;
// Process devices returned by discovery
if (r.devices.length == 0) {
$('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip'));
$('#wiz_hue_discovered').html("")
}
else {
hueIPs = [];
hueIPsinc = 0;
let discoveryMethod = "ssdp";
if (res.info.discoveryMethod) {
discoveryMethod = res.info.discoveryMethod;
}
for (const device of r.devices) {
if (device) {
let host;
let port;
if (discoveryMethod === "ssdp") {
if (device.hostname && device.domain) {
host = device.hostname + "." + device.domain;
port = device.port;
} else {
host = device.ip;
port = device.port;
}
} else {
host = device.service;
port = device.port;
}
if (host) {
if (!hueIPs.some(item => item.host === host)) {
hueIPs.push({ host: host, port: port });
}
}
}
}
$('#wiz_hue_ipstate').html("");
$('#host').val(hueIPs[hueIPsinc].host)
$('#port').val(hueIPs[hueIPsinc].port)
$('#hue_bridge_select').html("");
for (const key in hueIPs) {
$('#hue_bridge_select').append(createSelOpt(key, hueIPs[key].host));
}
$('.hue_bridge_sel_watch').on("click", function () {
hueIPsinc = $(this).val();
const name = $("#hue_bridge_select option:selected").text();
$('#host').val(name);
$('#port').val(hueIPs[hueIPsinc].port)
const usr = $('#user').val();
if (usr != "") {
checkHueBridge(checkUserResult, usr);
} else {
checkHueBridge(checkBridgeResult);
}
});
$('.hue_bridge_sel_watch').click();
}
}
}
async function getProperties(cb, hostAddress, port, username, resourceFilter) {
let params = { host: hostAddress, username: username, filter: resourceFilter };
if (port !== 'undefined') {
params.port = parseInt(port);
}
const ledType = 'philipshue';
const key = hostAddress;
//Create ledType cache entry
if (!devicesProperties[ledType]) {
devicesProperties[ledType] = {};
}
// Use device's properties, if properties in chache
if (devicesProperties[ledType][key] && devicesProperties[ledType][key][username]) {
updateBridgeDetails(devicesProperties[ledType][key]);
cb(true, username);
} else {
const res = await requestLedDeviceProperties(ledType, params);
if (res && !res.error) {
const ledDeviceProperties = res.info.properties;
if (!jQuery.isEmptyObject(ledDeviceProperties)) {
devicesProperties[ledType][key] = {};
devicesProperties[ledType][key][username] = ledDeviceProperties;
isAPIv2Ready = res.info.isAPIv2Ready;
devicesProperties[ledType][key].isAPIv2Ready = isAPIv2Ready;
isEntertainmentReady = res.info.isEntertainmentReady;
devicesProperties[ledType][key].isEntertainmentReady = isEntertainmentReady;
updateBridgeDetails(devicesProperties[ledType][key]);
if (username === "config") {
cb(true);
} else {
cb(true, username);
}
} else {
cb(false, username);
}
} else {
cb(false, username);
}
}
}
async function identify(hostAddress, port, username, name, id, id_v1) {
const disabled = $('#btn_wiz_save').is(':disabled');
// Take care that new record cannot be save during background process
$('#btn_wiz_save').prop('disabled', true);
let params = { host: decodeURIComponent(hostAddress), username: username, lightName: decodeURIComponent(name), lightId: id, lightId_v1: id_v1 };
if (port !== 'undefined') {
params.port = parseInt(port);
}
await requestLedDeviceIdentification('philipshue', params);
if (!window.readOnlyMode) {
$('#btn_wiz_save').prop('disabled', disabled);
}
}
function begin() {
const usr = utils.eV("username");
if (usr != "") {
$('#user').val(usr);
}
const clkey = utils.eV("clientkey");
if (clkey != "") {
$('#clientkey').val(clkey);
}
//check if host is empty/reachable/search for bridge
if (utils.eV("host") == "") {
hueIPs = [];
hueIPsinc = 0;
discover();
}
else {
const host = utils.eV("host");
$('#host').val(host);
const port = utils.eV("port");
if (port > 0) {
$('#port').val(port);
}
else {
$('#port').val('');
}
hueIPs.push({ host: host, port: port });
if (usr != "") {
checkHueBridge(checkUserResult, usr);
} else {
checkHueBridge(checkBridgeResult);
}
}
$('#retry_bridge').off().on('click', function () {
const host = $('#host').val();
const port = parseInt($('#port').val());
if (host != "") {
const idx = hueIPs.findIndex(item => item.host === host && item.port === port);
if (idx === -1) {
hueIPs.push({ host: host, port: port });
hueIPsinc = hueIPs.length - 1;
} else {
hueIPsinc = idx;
}
}
else {
discover();
}
const usr = $('#user').val();
if (usr != "") {
checkHueBridge(checkUserResult, usr);
} else {
checkHueBridge(checkBridgeResult);
}
});
$('#retry_usr').off().on('click', function () {
checkHueBridge(checkUserResult, $('#user').val());
});
$('#wiz_hue_create_user').off().on('click', function () {
createHueUser();
});
$('#btn_wiz_save').off().on("click", function () {
let hueLedConfig = [];
let finalLightIds = [];
let channelNumber = 0;
//create hue led config
for (const key in groupLights) {
const lightId = groupLights[key];
if ($('#hue_' + lightId).val() != "disabled") {
finalLightIds.push(lightId);
let lightName;
if (isAPIv2Ready) {
const light = hueLights.find(light => light.id === lightId);
lightName = light.metadata.name;
} else {
lightName = hueLights[lightId].name;
}
const position = $('#hue_' + lightId).val();
const lightIdx = groupLights.indexOf(lightId);
const lightLocation = groupLightsLocations[lightIdx];
let serviceID;
if (isAPIv2Ready) {
if (lightLocation) {
serviceID = lightLocation.service.rid;
}
}
if (position.startsWith("entertainment")) {
// Layout per entertainment area definition at bridge
let isFocusCenter = false;
if (position === "entertainment_center") {
isFocusCenter = true;
}
if (isAPIv2Ready) {
groupChannels.forEach((channel) => {
if (channel.members[0].service.rid === serviceID) {
const layoutObject = assignLightEntertainmentPos(isFocusCenter, channel.position, lightName, channel.channel_id);
hueLedConfig.push(JSON.parse(JSON.stringify(layoutObject)));
++channelNumber;
}
});
} else {
const layoutObject = assignLightEntertainmentPos(isFocusCenter, lightLocation.position, lightName);
hueLedConfig.push(JSON.parse(JSON.stringify(layoutObject)));
}
}
else {
// Layout per manual settings
let maxSegments = 1;
if (isAPIv2Ready && serviceID) {
const service = hueEntertainmentServices.find(service => service.id === serviceID);
maxSegments = service.segments.max_segments;
}
if (maxSegments > 1) {
const segment = service.segments.segments;
const layoutObjects = assignSegmentedLightPos(segment, position, lightName);
hueLedConfig.push(...layoutObjects);
} else {
const layoutObject = utils.assignLightPos(position, lightName);
hueLedConfig.push(JSON.parse(JSON.stringify(layoutObject)));
}
channelNumber += maxSegments;
}
}
}
let sc = window.serverConfig;
sc.leds = hueLedConfig;
//Adjust gamma, brightness and compensation
let c = sc.color.channelAdjustment[0];
c.gammaBlue = 1.0;
c.gammaRed = 1.0;
c.gammaGreen = 1.0;
c.brightness = 100;
c.brightnessCompensation = 0;
//device config
//Start with a clean configuration
let d = {};
d.host = $('#host').val();
d.port = parseInt($('#port').val());
d.username = $('#user').val();
d.type = 'philipshue';
d.colorOrder = 'rgb';
d.lightIds = finalLightIds;
d.transitiontime = parseInt(utils.eV("transitiontime", 1));
d.restoreOriginalState = utils.eV("restoreOriginalState", false);
d.switchOffOnBlack = utils.eV("switchOffOnBlack", false);
d.blackLevel = parseFloat(utils.eV("blackLevel", 0.009));
d.onBlackTimeToPowerOff = parseInt(utils.eV("onBlackTimeToPowerOff", 600));
d.onBlackTimeToPowerOn = parseInt(utils.eV("onBlackTimeToPowerOn", 300));
d.brightnessFactor = parseFloat(utils.eV("brightnessFactor", 1));
d.clientkey = $('#clientkey').val();
d.groupId = $('#groupId').val();
d.blackLightsTimeout = parseInt(utils.eV("blackLightsTimeout", 5000));
d.brightnessMin = parseFloat(utils.eV("brightnessMin", 0));
d.brightnessMax = parseFloat(utils.eV("brightnessMax", 1));
d.brightnessThreshold = parseFloat(utils.eV("brightnessThreshold", 0.0001));
d.handshakeTimeoutMin = parseInt(utils.eV("handshakeTimeoutMin", 300));
d.handshakeTimeoutMax = parseInt(utils.eV("handshakeTimeoutMax", 1000));
d.verbose = utils.eV("verbose");
d.autoStart = conf_editor.getEditor("root.generalOptions.autoStart").getValue();
d.enableAttempts = parseInt(conf_editor.getEditor("root.generalOptions.enableAttempts").getValue());
d.enableAttemptsInterval = parseInt(conf_editor.getEditor("root.generalOptions.enableAttemptsInterval").getValue());
d.useEntertainmentAPI = isEntertainmentReady && (d.groupId !== "");
d.useAPIv2 = isAPIv2Ready;
if (d.useEntertainmentAPI) {
d.hardwareLedCount = channelNumber;
if (window.serverConfig.device.type !== d.type) {
//smoothing on, if new device
sc.smoothing = { enable: true };
}
} else {
d.hardwareLedCount = finalLightIds.length;
d.verbose = false;
if (window.serverConfig.device.type !== d.type) {
//smoothing off, if new device
sc.smoothing = { enable: false };
}
}
window.serverConfig.device = d;
requestWriteConfig(sc, true);
resetWizard();
});
$('#btn_wiz_abort').off().on('click', resetWizard);
}
function createHueUser() {
const host = hueIPs[hueIPsinc].host;
const port = hueIPs[hueIPsinc].port;
let params = { host: host };
if (port !== 'undefined') {
params.port = parseInt(port);
}
let retryTime = 30;
const retryInterval = 2;
const UserInterval = setInterval(function () {
$('#wizp1').toggle(false);
$('#wizp2').toggle(false);
$('#wizp3').toggle(true);
(async () => {
retryTime -= retryInterval;
$("#connectionTime").html(retryTime);
if (retryTime <= 0) {
abortConnection(UserInterval);
clearInterval(UserInterval);
}
else {
const res = await requestLedDeviceAddAuthorization('philipshue', params);
if (res && !res.error) {
const response = res.info;
if (jQuery.isEmptyObject(response)) {
debugMessage(retryTime + ": link button not pressed or device not reachable");
} else {
$('#wizp1').toggle(false);
$('#wizp2').toggle(true);
$('#wizp3').toggle(false);
const username = response.username;
if (username != 'undefined') {
$('#user').val(username);
conf_editor.getEditor("root.specificOptions.username").setValue(username);
conf_editor.getEditor("root.specificOptions.host").setValue(host);
conf_editor.getEditor("root.specificOptions.port").setValue(port);
}
if (isEntertainmentReady) {
const clientkey = response.clientkey;
if (clientkey != 'undefined') {
$('#clientkey').val(clientkey);
conf_editor.getEditor("root.specificOptions.clientkey").setValue(clientkey);
}
}
checkHueBridge(checkUserResult, username);
clearInterval(UserInterval);
}
} else {
$('#wizp1').toggle(false);
$('#wizp2').toggle(true);
$('#wizp3').toggle(false);
clearInterval(UserInterval);
}
}
})();
}, retryInterval * 1000);
}
function get_hue_groups(username) {
const host = hueIPs[hueIPsinc].host;
if (devicesProperties['philipshue'][host] && devicesProperties['philipshue'][host][username]) {
const ledProperties = devicesProperties['philipshue'][host][username];
if (isAPIv2Ready) {
if (!jQuery.isEmptyObject(ledProperties.data)) {
if (Object.keys(ledProperties.data).length > 0) {
hueEntertainmentConfigs = ledProperties.data.filter(config => {
return config.type === "entertainment_configuration";
});
hueEntertainmentServices = ledProperties.data.filter(config => {
return (config.type === "entertainment" && config.renderer === true);
});
}
}
} else if (!jQuery.isEmptyObject(ledProperties.groups)) {
hueEntertainmentConfigs = [];
let hueGroups = ledProperties.groups;
for (const groupid in hueGroups) {
if (hueGroups[groupid].type == 'Entertainment') {
hueGroups[groupid].id = groupid;
hueEntertainmentConfigs.push(hueGroups[groupid]);
}
}
}
if (Object.keys(hueEntertainmentConfigs).length > 0) {
$('.lidsb').html("");
$('#wh_topcontainer').toggle(false);
$('#hue_grp_ids_t').toggle(true);
for (const groupid in hueEntertainmentConfigs) {
$('.gidsb').append(createTableRow([groupid + ' (' + hueEntertainmentConfigs[groupid].name + ')',
'<button class="btn btn-sm btn-primary btn-group" data-groupid="' + groupid + '" data-username="' + username + '")>'
+ $.i18n('wiz_hue_e_use_group') + '</button>']));
}
attachGroupButtonEvent();
} else {
noAPISupport('wiz_hue_e_noegrpids', username);
}
}
}
function attachIdentifyButtonEvent() {
$('#wizp2_body').on('click', '.btn-identify', function () {
const hostname = $(this).data('hostname');
const port = $(this).data('port');
const user = $(this).data('user');
const lightName = $(this).data('light-name');
const lightId = $(this).data('light-id');
const lightId_v1 = $(this).data('light-id-v1');
identify(hostname, port, user, lightName, lightId, lightId_v1);
});
}
function attachGroupButtonEvent() {
$('#wizp2_body').on('click', '.btn-group', function () {
const groupid = $(this).data('groupid');
const username = $(this).data('username');
useGroupId(groupid, username);
});
}
function noAPISupport(txt, username) {
showNotification('danger', $.i18n('wiz_hue_e_title'), $.i18n('wiz_hue_e_noapisupport_hint'));
conf_editor.getEditor("root.specificOptions.useEntertainmentAPI").setValue(false);
$("#root_specificOptions_useEntertainmentAPI").trigger("change");
$('#btn_wiz_holder').append('<div class="bs-callout bs-callout-danger" style="margin-top:0px">' + $.i18n('wiz_hue_e_noapisupport_hint') + '</div>');
$('#hue_grp_ids_t').toggle(false);
const errorMessage = txt ? $.i18n(txt) : $.i18n('wiz_hue_e_nogrpids');
$('<p style="font-weight:bold;color:red;">' + errorMessage + '<br />' + $.i18n('wiz_hue_e_noapisupport') + '</p>').insertBefore('#wizp2_body #hue_ids_t');
$('#hue_id_headline').html($.i18n('wiz_hue_desc2'));
get_hue_lights(username);
}
function get_hue_lights(username) {
const host = hueIPs[hueIPsinc].host;
if (devicesProperties['philipshue'][host] && devicesProperties['philipshue'][host][username]) {
const ledProperties = devicesProperties['philipshue'][host][username];
if (isAPIv2Ready) {
if (!jQuery.isEmptyObject(ledProperties.data)) {
if (Object.keys(ledProperties.data).length > 0) {
hueLights = ledProperties.data.filter(config => {
return config.type === "light";
});
}
}
} else if (!jQuery.isEmptyObject(ledProperties.lights)) {
hueLights = ledProperties.lights;
}
if (Object.keys(hueLights).length > 0) {
if (!isEntertainmentReady) {
$('#wh_topcontainer').toggle(false);
}
$('#hue_ids_t, #btn_wiz_save').toggle(true);
const lightOptions = [
"top", "topleft", "topright",
"bottom", "bottomleft", "bottomright",
"left", "lefttop", "leftmiddle", "leftbottom",
"right", "righttop", "rightmiddle", "rightbottom",
"entire",
"lightPosTopLeft112", "lightPosTopLeftNewMid", "lightPosTopLeft121",
"lightPosBottomLeft14", "lightPosBottomLeft12", "lightPosBottomLeft34", "lightPosBottomLeft11",
"lightPosBottomLeft112", "lightPosBottomLeftNewMid", "lightPosBottomLeft121"
];
if (isEntertainmentReady && hueEntertainmentConfigs.length > 0) {
lightOptions.unshift("entertainment_center");
lightOptions.unshift("entertainment");
} else {
lightOptions.unshift("disabled");
if (isAPIv2Ready) {
for (const light in hueLights) {
groupLights.push(hueLights[light].id);
}
} else {
groupLights = Object.keys(hueLights);
}
}
$('.lidsb').html("");
let pos = "";
for (const id in groupLights) {
const lightId = groupLights[id];
let lightId_v1 = "/lights/" + lightId;
let lightName;
if (isAPIv2Ready) {
const light = hueLights.find(light => light.id === lightId);
lightName = light.metadata.name;
lightId_v1 = light.id_v1;
} else {
lightName = hueLights[lightId].name;
}
if (isEntertainmentReady) {
let lightLocation = {};
lightLocation = groupLightsLocations[id];
if (lightLocation) {
if (isAPIv2Ready) {
pos = 0;
} else {
const x = lightLocation.position.x;
const y = lightLocation.position.y;
const z = lightLocation.position.z;
let xval = (x < 0) ? "left" : "right";
if (z != 1 && x >= -0.25 && x <= 0.25) xval = "";
switch (z) {
case 1: // top / Ceiling height
pos = "top" + xval;
break;
case 0: // middle / TV height
pos = (xval == "" && y >= 0.75) ? "bottom" : xval + "middle";
break;
case -1: // bottom / Ground height
pos = xval + "bottom";
break;
}
}
}
}
let options = "";
for (const opt in lightOptions) {
const val = lightOptions[opt];
const txt = (val != 'entire' && val != 'disabled') ? 'conf_leds_layout_cl_' : 'wiz_ids_';
options += '<option value="' + val + '"';
if (pos == val) options += ' selected="selected"';
options += '>' + $.i18n(txt + val) + '</option>';
}
$('.lidsb').append(createTableRow([id + ' (' + lightName + ')',
'<select id="hue_' + lightId + '" class="hue_sel_watch form-control">'
+ options
+ '</select>',
'<button class="btn btn-sm btn-primary btn-identify" data-hostname="' + encodeURIComponent($(" #host").val()) + '" data-port="' + $('#port').val() + '" data-user="' + $("#user").val() + '" data-light-name="' + encodeURIComponent(lightName) + '" data-light-id="' + lightId + '" data-light-id-v1="' + lightId_v1 + '">'
+ $.i18n('wiz_hue_blinkblue', id)
+ '</button>']));
}
attachIdentifyButtonEvent();
if (!isEntertainmentReady) {
$('.hue_sel_watch').on("change", function () {
let cC = 0;
for (const key in hueLights) {
if ($('#hue_' + key).val() != "disabled") {
cC++;
}
}
(cC == 0 || window.readOnlyMode) ? $('#btn_wiz_save').prop("disabled", true) : $('#btn_wiz_save').prop("disabled", false);
});
}
$('.hue_sel_watch').trigger('change');
}
else {
const txt = '<p style="font-weight:bold;color:red;">' + $.i18n('wiz_hue_noids') + '</p>';
$('#wizp2_body').append(txt);
}
}
}
function abortConnection(UserInterval) {
clearInterval(UserInterval);
$('#wizp1').toggle(false);
$('#wizp2').toggle(true);
$('#wizp3').toggle(false);
$("#wiz_hue_usrstate").html($.i18n('wiz_hue_failure_connection'));
}
return {
start: function (e) {
//create html
const hue_title = 'wiz_hue_title';
const hue_intro1 = 'wiz_hue_e_intro1';
const hue_desc1 = 'wiz_hue_desc1';
const hue_create_user = 'wiz_hue_create_user';
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>' + $.i18n(hue_title));
$('#wizp1_body').html('<h4 style="font-weight:bold;text-transform:uppercase;">' + $.i18n(hue_title) + '</h4><p>' + $.i18n(hue_intro1) + '</p>');
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>' + $.i18n('general_btn_continue') + '</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>');
$('#wizp2_body').html('<div id="wh_topcontainer"></div>');
let topContainer_html = '<p class="text-left" style="font-weight:bold">' + $.i18n(hue_desc1) + '</p>' +
'<div class="row">' +
'<div class="col-md-2">' +
' <p class="text-left">' + $.i18n('wiz_hue_ip') + '</p></div>' +
' <div class="col-md-7"><div class="input-group">' +
' <span class="input-group-addon" id="retry_bridge" style="cursor:pointer"><i class="fa fa-refresh"></i></span>' +
' <select id="hue_bridge_select" class="hue_bridge_sel_watch form-control">' + '</select>' + '</div></div>' +
' <div class="col-md-7"><div class="input-group">' +
' <span class="input-group-addon"><i class="fa fa-arrow-right"></i></span>' +
' <input type="text" class="input-group form-control" id="host" placeholder="' + $.i18n('wiz_hue_ip') + '"></div></div>';
if (storedAccess === 'expert') {
topContainer_html += '<div class="col-md-3"><div class="input-group">' +
'<span class="input-group-addon">:</span>' +
'<input type="text" class="input-group form-control" id="port" placeholder="' + $.i18n('edt_conf_general_port_title') + '"></div></div>';
}
topContainer_html += '</div><p><span style="font-weight:bold;color:red" id="wiz_hue_ipstate"></span><span style="font-weight:bold;" id="wiz_hue_discovered"></span></p>';
topContainer_html += '<div class="form-group" id="usrcont" style="display:none"></div>';
$('#wh_topcontainer').append(topContainer_html);
$('#usrcont').append('<div class="row"><div class="col-md-2"><p class="text-left">' + $.i18n('wiz_hue_username') + '</p ></div>' +
'<div class="col-md-7">' +
'<div class="input-group">' +
' <span class="input-group-addon" id="retry_usr" style="cursor:pointer"><i class="fa fa-refresh"></i></span>' +
' <input type="text" class="input-group form-control" id="user">' +
'</div></div></div><br>' +
'</div><input type="hidden" id="groupId">'
);
$('#usrcont').append('<div id="hue_client_key_r" class="row"><div class="col-md-2"><p class="text-left">' + $.i18n('wiz_hue_clientkey') +
'</p></div><div class="col-md-7"><input class="form-control" id="clientkey" type="text"></div></div><br>');
$('#usrcont').append('<p><span style="font-weight:bold;color:red" id="wiz_hue_usrstate"></span></p>' +
'<button type="button" class="btn btn-primary" style="display:none" id="wiz_hue_create_user"> <i class="fa fa-fw fa-plus"></i>' + $.i18n(hue_create_user) + '</button>');
$('#wizp2_body').append('<div id="hue_grp_ids_t" style="display:none"><p class="text-left" style="font-weight:bold">' + $.i18n('wiz_hue_e_desc2') + '</p></div>');
createTable("gidsh", "gidsb", "hue_grp_ids_t");
$('.gidsh').append(createTableRow([$.i18n('edt_dev_spec_groupId_title'), ""], true));
$('#wizp2_body').append('<div id="hue_ids_t" style="display:none"><p class="text-left" style="font-weight:bold" id="hue_id_headline">' + $.i18n('wiz_hue_e_desc3') + '</p></div>');
createTable("lidsh", "lidsb", "hue_ids_t");
$('.lidsh').append(createTableRow([$.i18n('edt_dev_spec_lightid_title'), $.i18n('wiz_pos'), $.i18n('wiz_identify')], true));
$('#wizp2_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_save" style="display:none"><i class="fa fa-fw fa-save"></i>' + $.i18n('general_btn_save') + '</button><button type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>');
$('#wizp3_body').html('<span>' + $.i18n('wiz_hue_press_link') + '</span> <br /><br /><center><span id="connectionTime"></span><br /><i class="fa fa-cog fa-spin" style="font-size:100px"></i></center>');
if (getStorage("darkMode") == "on")
$('#wizard_logo').attr("src", 'img/hyperion/logo_negativ.png');
//open modal
$("#wizard_modal").modal({
backdrop: "static",
keyboard: false,
show: true
});
//listen for continue
$('#btn_wiz_cont').off().on('click', function () {
begin();
$('#wizp1').toggle(false);
$('#wizp2').toggle(true);
});
}
};
})();
export { philipshueWizard }

View File

@ -0,0 +1,60 @@
const ledDeviceWizardUtils = (() => {
// Layout positions
const positionMap = {
"top": { hmin: 0.15, hmax: 0.85, vmin: 0, vmax: 0.2 },
"topleft": { hmin: 0, hmax: 0.15, vmin: 0, vmax: 0.15 },
"topright": { hmin: 0.85, hmax: 1.0, vmin: 0, vmax: 0.15 },
"bottom": { hmin: 0.15, hmax: 0.85, vmin: 0.8, vmax: 1.0 },
"bottomleft": { hmin: 0, hmax: 0.15, vmin: 0.85, vmax: 1.0 },
"bottomright": { hmin: 0.85, hmax: 1.0, vmin: 0.85, vmax: 1.0 },
"left": { hmin: 0, hmax: 0.15, vmin: 0.15, vmax: 0.85 },
"lefttop": { hmin: 0, hmax: 0.15, vmin: 0, vmax: 0.5 },
"leftmiddle": { hmin: 0, hmax: 0.15, vmin: 0.25, vmax: 0.75 },
"leftbottom": { hmin: 0, hmax: 0.15, vmin: 0.5, vmax: 1.0 },
"right": { hmin: 0.85, hmax: 1.0, vmin: 0.15, vmax: 0.85 },
"righttop": { hmin: 0.85, hmax: 1.0, vmin: 0, vmax: 0.5 },
"rightmiddle": { hmin: 0.85, hmax: 1.0, vmin: 0.25, vmax: 0.75 },
"rightbottom": { hmin: 0.85, hmax: 1.0, vmin: 0.5, vmax: 1.0 },
"lightPosBottomLeft14": { hmin: 0, hmax: 0.25, vmin: 0.85, vmax: 1.0 },
"lightPosBottomLeft12": { hmin: 0.25, hmax: 0.5, vmin: 0.85, vmax: 1.0 },
"lightPosBottomLeft34": { hmin: 0.5, hmax: 0.75, vmin: 0.85, vmax: 1.0 },
"lightPosBottomLeft11": { hmin: 0.75, hmax: 1, vmin: 0.85, vmax: 1.0 },
"lightPosBottomLeft112": { hmin: 0, hmax: 0.5, vmin: 0.85, vmax: 1.0 },
"lightPosBottomLeft121": { hmin: 0.5, hmax: 1, vmin: 0.85, vmax: 1.0 },
"lightPosBottomLeftNewMid": { hmin: 0.25, hmax: 0.75, vmin: 0.85, vmax: 1.0 },
"lightPosTopLeft112": { hmin: 0, hmax: 0.5, vmin: 0, vmax: 0.15 },
"lightPosTopLeft121": { hmin: 0.5, hmax: 1, vmin: 0, vmax: 0.15 },
"lightPosTopLeftNewMid": { hmin: 0.25, hmax: 0.75, vmin: 0, vmax: 0.15 },
"lightPosEntire": { hmin: 0.0, hmax: 1.0, vmin: 0.0, vmax: 1.0 }
};
return {
//return editor Value
eV: function (vn, defaultVal = "") {
let editor = null;
if (vn) {
editor = conf_editor.getEditor("root.specificOptions." + vn);
}
if (editor === null) {
return defaultVal;
} else if (defaultVal !== "" && !isNaN(defaultVal) && isNaN(editor.getValue())) {
return defaultVal;
} else {
return editor.getValue();
}
},
assignLightPos: function (pos, name) {
// Retrieve the corresponding position object from the positionMap
const i = positionMap[pos] || positionMap["lightPosEntire"];
i.name = name;
return i;
}
};
})();
export { ledDeviceWizardUtils };

View File

@ -0,0 +1,300 @@
//****************************
// Wizard Yeelight
//****************************
import { ledDeviceWizardUtils as utils } from './LedDevice_utils.js';
const yeelightWizard = (() => {
const lights = [];
let configuredLights = conf_editor.getEditor("root.specificOptions.lights").getValue();
function getHostInLights(hostname) {
return lights.filter(
function (lights) {
return lights.host === hostname
}
);
}
function begin() {
discover();
$('#btn_wiz_save').off().on("click", function () {
let ledConfig = [];
let finalLights = [];
//create yeelight led config
for (const key in lights) {
if ($('#yee_' + key).val() !== "disabled") {
let name = lights[key].name;
// Set Name to layout-position, if empty
if (name === "") {
name = lights[key].host;
}
finalLights.push(lights[key]);
const idx_content = utils.assignLightPos($('#yee_' + key).val(), name);
ledConfig.push(JSON.parse(JSON.stringify(idx_content)));
}
}
//LED layout
window.serverConfig.leds = ledConfig;
//LED device config
const currentDeviceType = window.serverConfig.device.type;
//Start with a clean configuration
let d = {};
d.type = 'yeelight';
d.hardwareLedCount = finalLights.length;
d.colorOrder = conf_editor.getEditor("root.generalOptions.colorOrder").getValue();
d.colorModel = parseInt(conf_editor.getEditor("root.specificOptions.colorModel").getValue());
d.transEffect = parseInt(conf_editor.getEditor("root.specificOptions.transEffect").getValue());
d.transTime = parseInt(conf_editor.getEditor("root.specificOptions.transTime").getValue());
d.extraTimeDarkness = parseInt(conf_editor.getEditor("root.specificOptions.extraTimeDarkness").getValue());
d.brightnessMin = parseInt(conf_editor.getEditor("root.specificOptions.brightnessMin").getValue());
d.brightnessSwitchOffOnMinimum = JSON.parse(conf_editor.getEditor("root.specificOptions.brightnessSwitchOffOnMinimum").getValue());
d.brightnessMax = parseInt(conf_editor.getEditor("root.specificOptions.brightnessMax").getValue());
d.brightnessFactor = parseFloat(conf_editor.getEditor("root.specificOptions.brightnessFactor").getValue());
d.latchTime = parseInt(conf_editor.getEditor("root.specificOptions.latchTime").getValue());;
d.debugLevel = parseInt(conf_editor.getEditor("root.specificOptions.debugLevel").getValue());
d.lights = finalLights;
window.serverConfig.device = d;
if (currentDeviceType !== d.type) {
//smoothing off, if new device
window.serverConfig.smoothing = { enable: false };
}
requestWriteConfig(window.serverConfig, true);
resetWizard();
});
$('#btn_wiz_abort').off().on('click', resetWizard);
}
async function discover() {
// Get discovered lights
const res = await requestLedDeviceDiscovery('yeelight');
if (res && !res.error) {
const r = res.info;
let discoveryMethod = "ssdp";
if (res.info.discoveryMethod) {
discoveryMethod = res.info.discoveryMethod;
}
// Process devices returned by discovery
for (const device of r.devices) {
if (device.hostname !== "") {
processDiscoverdDevice(device, discoveryMethod);
}
}
// Add additional items from configuration
for (const configuredLight of configuredLights) {
processConfiguredLight(configuredLight);
}
assign_lights();
}
}
function processDiscoverdDevice(device, discoveryMethod) {
if (getHostInLights(device.hostname).length > 0) {
return;
}
const light = {
host: device.hostname
};
if (discoveryMethod === "ssdp") {
if (device.domain) {
light.host += '.' + device.domain;
}
} else {
light.host = device.service;
light.name = device.name;
}
light.port = device.port;
if (device.txt) {
light.model = device.txt.md;
light.port = 55443; // Yeelight default port
} else {
light.name = device.other.name;
light.model = device.other.model;
}
lights.push(light);
}
function processConfiguredLight(configuredLight) {
const host = configuredLight.host;
let port = configuredLight.port || 0;
if (host !== "" && getHostInLights(host).length === 0) {
const light = {
host: host,
port: port,
name: configuredLight.name,
model: "color4"
};
lights.push(light);
}
}
function attachIdentifyButtonEvent() {
$('#wizp2_body').on('click', '.btn-identify', function () {
const hostname = $(this).data('hostname');
const port = $(this).data('port');
identify(hostname, port);
});
}
function assign_lights() {
// Model mappings, see https://www.home-assistant.io/integrations/yeelight/
const models = ['color', 'color1', 'YLDP02YL', 'YLDP02YL', 'color2', 'YLDP06YL', 'color4', 'YLDP13YL', 'color6', 'YLDP13AYL', 'colorb', "YLDP005", 'colorc', "YLDP004-A", 'stripe', 'YLDD04YL', 'strip1', 'YLDD01YL', 'YLDD02YL', 'strip4', 'YLDD05YL', 'strip6', 'YLDD05YL'];
// If records are left for configuration
if (Object.keys(lights).length > 0) {
$('#wh_topcontainer').toggle(false);
$('#yee_ids_t, #btn_wiz_save').toggle(true);
const lightOptions = [
"top", "topleft", "topright",
"bottom", "bottomleft", "bottomright",
"left", "lefttop", "leftmiddle", "leftbottom",
"right", "righttop", "rightmiddle", "rightbottom",
"entire",
"lightPosTopLeft112", "lightPosTopLeftNewMid", "lightPosTopLeft121",
"lightPosBottomLeft14", "lightPosBottomLeft12", "lightPosBottomLeft34", "lightPosBottomLeft11",
"lightPosBottomLeft112", "lightPosBottomLeftNewMid", "lightPosBottomLeft121"
];
lightOptions.unshift("disabled");
$('.lidsb').html("");
let pos = "";
for (const lightid in lights) {
const lightHostname = lights[lightid].host;
const lightPort = lights[lightid].port;
let lightName = lights[lightid].name;
if (lightName === "")
lightName = $.i18n('edt_dev_spec_lights_itemtitle') + '(' + lightHostname + ')';
let options = "";
for (const opt in lightOptions) {
const val = lightOptions[opt];
const txt = (val !== 'entire' && val !== 'disabled') ? 'conf_leds_layout_cl_' : 'wiz_ids_';
options += '<option value="' + val + '"';
if (pos === val) options += ' selected="selected"';
options += '>' + $.i18n(txt + val) + '</option>';
}
let enabled = 'enabled';
if (!models.includes(lights[lightid].model)) {
enabled = 'disabled';
options = '<option value=disabled>' + $.i18n('wiz_yeelight_unsupported') + '</option>';
}
$('.lidsb').append(createTableRow([(parseInt(lightid, 10) + 1) + '. ' + lightName, '<select id="yee_' + lightid + '" ' + enabled + ' class="yee_sel_watch form-control">'
+ options
+ '</select>', '<button class="btn btn-sm btn-primary btn-identify" data-hostname="' + lightHostname + '" data-port="' + lightPort + '")>'
+ $.i18n('wiz_identify') + '</button>']));
}
attachIdentifyButtonEvent();
$('.yee_sel_watch').on("change", function () {
let cC = 0;
for (const key in lights) {
if ($('#yee_' + key).val() !== "disabled") {
cC++;
}
}
if (cC === 0 || window.readOnlyMode)
$('#btn_wiz_save').prop("disabled", true);
else
$('#btn_wiz_save').prop("disabled", false);
});
$('.yee_sel_watch').trigger('change');
}
else {
const noLightsTxt = '<p style="font-weight:bold;color:red;">' + $.i18n('wiz_noLights', 'lights') + '</p>';
$('#wizp2_body').append(noLightsTxt);
}
}
async function identify(host, port) {
const disabled = $('#btn_wiz_save').is(':disabled');
// Take care that new record cannot be save during background process
$('#btn_wiz_save').prop('disabled', true);
const params = { host: host, port: port };
await requestLedDeviceIdentification("yeelight", params);
if (!window.readOnlyMode) {
$('#btn_wiz_save').prop('disabled', disabled);
}
}
return {
start: function (e) {
//create html
const yeelight_title = 'wiz_yeelight_title';
const yeelight_intro1 = 'wiz_yeelight_intro1';
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>' + $.i18n(yeelight_title));
$('#wizp1_body').html('<h4 style="font-weight:bold;text-transform:uppercase;">' + $.i18n(yeelight_title) + '</h4><p>' + $.i18n(yeelight_intro1) + '</p>');
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>'
+ $.i18n('general_btn_continue') + '</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>'
+ $.i18n('general_btn_cancel') + '</button>');
$('#wizp2_body').html('<div id="wh_topcontainer"></div>');
$('#wh_topcontainer').append('<div class="form-group" id="usrcont" style="display:none"></div>');
$('#wizp2_body').append('<div id="yee_ids_t" style="display:none"><p style="font-weight:bold" id="yee_id_headline">' + $.i18n('wiz_yeelight_desc2') + '</p></div>');
createTable("lidsh", "lidsb", "yee_ids_t");
$('.lidsh').append(createTableRow([$.i18n('edt_dev_spec_lights_title'), $.i18n('wiz_pos'), $.i18n('wiz_identify')], true));
$('#wizp2_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_save" style="display:none"><i class="fa fa-fw fa-save"></i>'
+ $.i18n('general_btn_save') + '</button><buttowindow.serverConfig.device = d;n type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>'
+ $.i18n('general_btn_cancel') + '</button>');
if (getStorage("darkMode") == "on")
$('#wizard_logo').attr("src", 'img/hyperion/logo_negativ.png');
//open modal
$("#wizard_modal").modal({ backdrop: "static", keyboard: false, show: true });
//listen for continue
$('#btn_wiz_cont').off().on('click', function () {
begin();
$('#wizp1').toggle(false);
$('#wizp2').toggle(true);
});
}
};
}) ();
export { yeelightWizard };

View File

@ -0,0 +1,485 @@
//****************************
// Wizard Color calibration via Kodi
//****************************
const colorCalibrationKodiWizard = (() => {
let ws;
const defaultKodiPort = 9090;
let kodiAddress = document.location.hostname;
let kodiPort = defaultKodiPort;
const kodiUrl = new URL("ws://" + kodiAddress);
kodiUrl.port = kodiPort;
kodiUrl.pathname = "/jsonrpc/websocket";
let wiz_editor;
let colorLength;
let cobj;
let step = 0;
let withKodi = false;
let profile = 0;
let websAddress;
let imgAddress;
let picnr = 0;
let id = 1;
const vidAddress = "https://sourceforge.net/projects/hyperion-project/files/resources/vid/";
const availVideos = ["Sweet_Cocoon", "Caminandes_2_GranDillama", "Caminandes_3_Llamigos"];
if (getStorage("kodiAddress") != null) {
kodiAddress = getStorage("kodiAddress");
kodiUrl.host = kodiAddress;
}
if (getStorage("kodiPort") != null) {
kodiPort = getStorage("kodiPort");
kodiUrl.port = kodiPort;
}
$(window).on('beforeunload', function () {
closeWebSocket();
});
function closeWebSocket() {
// Check if the WebSocket is open
if (ws && ws.readyState === WebSocket.OPEN) {
ws.close();
}
}
function sendToKodi(type, content) {
let command;
switch (type) {
case "msg":
command = { "jsonrpc": "2.0", "method": "GUI.ShowNotification", "params": { "title": $.i18n('wiz_cc_title'), "message": content, "image": "info", "displaytime": 5000 }, "id": id };
break;
case "stop":
command = { "jsonrpc": "2.0", "method": "Player.Stop", "params": { "playerid": 2 }, "id": id };
break;
case "playP":
content = imgAddress + content + '.png';
command = { "jsonrpc": "2.0", "method": "Player.Open", "params": { "item": { "file": content } }, "id": id };
break;
case "playV":
content = vidAddress + content;
command = { "jsonrpc": "2.0", "method": "Player.Open", "params": { "item": { "file": content } }, "id": id };
break;
case "rotate":
command = { "jsonrpc": "2.0", "method": "Player.Rotate", "params": { "playerid": 2 }, "id": id };
break;
default:
console.error('Unknown Kodi command type: ', type);
}
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(command));
++id;
} else {
console.error('WebSocket connection is not open. Unable to send command.');
}
}
function performAction() {
let h;
if (step == 1) {
$('#wiz_cc_desc').html($.i18n('wiz_cc_chooseid'));
updateEditor(["id"]);
$('#btn_wiz_back').prop("disabled", true);
}
else
$('#btn_wiz_back').prop("disabled", false);
if (step == 2) {
updateEditor(["white"]);
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_white_title'));
if (withKodi) {
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_white_title'));
sendToKodi('playP', "white");
}
else
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_white_title'));
$('#wiz_cc_desc').html(h);
}
if (step == 3) {
updateEditor(["gammaRed", "gammaGreen", "gammaBlue"]);
h = '<p>' + $.i18n('wiz_cc_adjustgamma') + '</p>';
if (withKodi) {
sendToKodi('playP', "HGradient");
h += '<button id="wiz_cc_btn_sp" class="btn btn-primary">' + $.i18n('wiz_cc_btn_switchpic') + '</button>';
}
else
h += '<p>' + $.i18n('wiz_cc_lettvshowm', "grey_1, grey_2, grey_3, HGradient, VGradient") + '</p>';
$('#wiz_cc_desc').html(h);
$('#wiz_cc_btn_sp').off().on('click', function () {
switchPicture(["VGradient", "grey_1", "grey_2", "grey_3", "HGradient"]);
});
}
if (step == 4) {
updateEditor(["red"]);
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_red_title'));
if (withKodi) {
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_red_title'));
sendToKodi('playP', "red");
}
else
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_red_title'));
$('#wiz_cc_desc').html(h);
}
if (step == 5) {
updateEditor(["green"]);
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_green_title'));
if (withKodi) {
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_green_title'));
sendToKodi('playP', "green");
}
else
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_green_title'));
$('#wiz_cc_desc').html(h);
}
if (step == 6) {
updateEditor(["blue"]);
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_blue_title'));
if (withKodi) {
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_blue_title'));
sendToKodi('playP', "blue");
}
else
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_blue_title'));
$('#wiz_cc_desc').html(h);
}
if (step == 7) {
updateEditor(["cyan"]);
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_cyan_title'));
if (withKodi) {
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_cyan_title'));
sendToKodi('playP', "cyan");
}
else
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_cyan_title'));
$('#wiz_cc_desc').html(h);
}
if (step == 8) {
updateEditor(["magenta"]);
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_magenta_title'));
if (withKodi) {
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_magenta_title'));
sendToKodi('playP', "magenta");
}
else
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_magenta_title'));
$('#wiz_cc_desc').html(h);
}
if (step == 9) {
updateEditor(["yellow"]);
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_yellow_title'));
if (withKodi) {
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_yellow_title'));
sendToKodi('playP', "yellow");
}
else
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_yellow_title'));
$('#wiz_cc_desc').html(h);
}
if (step == 10) {
updateEditor(["backlightThreshold", "backlightColored"]);
h = $.i18n('wiz_cc_backlight');
if (withKodi) {
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_black_title'));
sendToKodi('playP', "black");
}
else
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_black_title'));
$('#wiz_cc_desc').html(h);
}
if (step == 11) {
updateEditor([""], true);
h = '<p>' + $.i18n('wiz_cc_testintro') + '</p>';
if (withKodi) {
h += '<p>' + $.i18n('wiz_cc_testintrok') + '</p>';
sendToKodi('stop');
availVideos.forEach(video => {
const txt = video.replace(/_/g, " ");
h += `<div><button id="${video}" class="btn btn-sm btn-primary videobtn"><i class="fa fa-fw fa-play"></i> ${txt}</button></div>`;
});
h += '<div><button id="stop" class="btn btn-sm btn-danger videobtn" style="margin-bottom:15px"><i class="fa fa-fw fa-stop"></i> ' + $.i18n('wiz_cc_btn_stop') + '</button></div>';
}
else
h += '<p>' + $.i18n('wiz_cc_testintrowok') + ' <a href="https://sourceforge.net/projects/hyperion-project/files/resources/vid/" target="_blank">' + $.i18n('wiz_cc_link') + '</a></p>';
h += '<p>' + $.i18n('wiz_cc_summary') + '</p>';
$('#wiz_cc_desc').html(h);
$('.videobtn').off().on('click', function (e) {
if (e.target.id == "stop")
sendToKodi("stop");
else
sendToKodi("playV", e.target.id + '.mp4');
$(this).prop("disabled", true);
setTimeout(function () { $('.videobtn').prop("disabled", false) }, 10000);
});
$('#btn_wiz_next').prop("disabled", true);
$('#btn_wiz_save').toggle(true);
window.readOnlyMode ? $('#btn_wiz_save').prop('disabled', true) : $('#btn_wiz_save').prop('disabled', false);
}
else {
$('#btn_wiz_next').prop("disabled", false);
$('#btn_wiz_save').toggle(false);
}
}
function switchPicture(pictures) {
if (typeof pictures[picnr] === 'undefined')
picnr = 0;
sendToKodi('playP', pictures[picnr]);
picnr++;
}
function initializeWebSocket(cb) {
if ("WebSocket" in window) {
if (kodiUrl.port === '') {
kodiUrl.port = defaultKodiPort;
}
if (!ws || ws.readyState !== WebSocket.OPEN) {
// Establish WebSocket connection
ws = new WebSocket(kodiUrl);
// WebSocket onopen event
ws.onopen = function (event) {
withKodi = true;
cb("opened");
};
// WebSocket onmessage event (handle incoming messages)
ws.onmessage = function (event) {
const response = JSON.parse(event.data);
if (response.method === "System.OnQuit") {
closeWebSocket();
} else if (response.result != undefined) {
if (response.result !== "OK") {
cb("error");
}
}
};
// WebSocket onerror event
ws.onerror = function (error) {
cb("error");
};
// WebSocket onclose event
ws.onclose = function (event) {
withKodi = false;
if (event.code === 1006) {
// Ignore error 1006 due to Kodi issue
console.log("WebSocket closed with error code 1006. Ignoring due to Kodi bug.");
}
else {
console.error("WebSocket closed with code:", event.code);
}
};
} else {
console.log("WebSocket connection is already open.");
}
}
else {
console.log("Kodi Access: WebSocket NOT supported by this browser");
cb("error");
}
}
function setupEventListeners() {
$('#btn_wiz_cancel').off().on('click', function () {
stop(true);
});
$('#wiz_cc_kodiip').off().on('change', function () {
kodiAddress = encodeURIComponent($(this).val().trim());
$('#kodi_status').html('');
if (kodiAddress !== "") {
if (!isValidHostnameOrIP(kodiAddress)) {
$('#kodi_status').html('<p style="color:red;font-weight:bold;margin-top:5px">' + $.i18n('edt_msgcust_error_hostname_ip') + '</p>');
withKodi = false;
} else {
if (isValidIPv6(kodiAddress)) {
kodiUrl.hostname = "[" + kodiAddress + "]";
} else {
kodiUrl.hostname = kodiAddress;
}
$('#kodi_status').html('<p style="font-weight:bold;margin-top:5px">' + $.i18n('wiz_cc_try_connect') + '</p>');
$('#btn_wiz_cont').prop('disabled', true);
closeWebSocket();
initializeWebSocket(function (cb) {
if (cb == "opened") {
setStorage("kodiAddress", kodiAddress);
setStorage("kodiPort", defaultKodiPort);
$('#kodi_status').html('<p style="color:green;font-weight:bold;margin-top:5px">' + $.i18n('wiz_cc_kodicon') + '</p>');
$('#btn_wiz_cont').prop('disabled', false);
if (withKodi) {
sendToKodi("msg", $.i18n('wiz_cc_kodimsg_start'));
}
}
else {
$('#kodi_status').html('<p style="color:red;font-weight:bold;margin-top:5px">' + $.i18n('wiz_cc_kodidiscon') + '</p><p>' + $.i18n('wiz_cc_kodidisconlink') + ' <a href="https://sourceforge.net/projects/hyperion-project/files/resources/Hyperion_calibration_pictures.zip/download" target="_blank">' + $.i18n('wiz_cc_link') + '</p>');
withKodi = false;
}
$('#btn_wiz_cont').prop('disabled', false);
});
}
}
});
//listen for continue
$('#btn_wiz_cont').off().on('click', function () {
begin();
$('#wizp1').toggle(false);
$('#wizp2').toggle(true);
});
}
function init() {
colorLength = window.serverConfig.color.channelAdjustment;
cobj = window.schema.color.properties.channelAdjustment.items.properties;
websAddress = document.location.hostname + ':' + window.serverConfig.webConfig.port;
imgAddress = 'http://' + websAddress + '/img/cc/';
setStorage("wizardactive", true);
}
function initProfiles() {
//check profile count
if (colorLength.length > 1) {
$('#multi_cali').html('<p style="font-weight:bold;">' + $.i18n('wiz_cc_morethanone') + '</p><select id="wiz_select" class="form-control" style="width:200px;margin:auto"></select>');
for (let i = 0; i < colorLength.length; i++)
$('#wiz_select').append(createSelOpt(i, i + 1 + ' (' + colorLength[i].id + ')'));
$('#wiz_select').off().on('change', function () {
profile = $(this).val();
});
}
}
function createEditor() {
wiz_editor = createJsonEditor('editor_container_wiz', {
color: window.schema.color
}, true, true);
$('#editor_container_wiz h4').toggle(false);
$('#editor_container_wiz .btn-group').toggle(false);
$('#editor_container_wiz [data-schemapath="root.color.imageToLedMappingType"]').toggle(false);
$('#editor_container_wiz [data-schemapath="root.color.reducedPixelSetFactorFactor"]').toggle(false);
for (let i = 0; i < colorLength.length; i++)
$('#editor_container_wiz [data-schemapath*="root.color.channelAdjustment.' + i + '."]').toggle(false);
}
function updateEditor(el, all) {
for (let key in cobj) {
if (all === true || el[0] == key || el[1] == key || el[2] == key)
$('#editor_container_wiz [data-schemapath*=".' + profile + '.' + key + '"]').toggle(true);
else
$('#editor_container_wiz [data-schemapath*=".' + profile + '.' + key + '"]').toggle(false);
}
}
function stop(reload) {
if (withKodi) {
sendToKodi("stop");
}
closeWebSocket();
resetWizard(reload);
}
function begin() {
step = 0;
$('#btn_wiz_next').off().on('click', function () {
step++;
performAction();
});
$('#btn_wiz_back').off().on('click', function () {
step--;
performAction();
});
$('#btn_wiz_abort').off().on('click', function () {
stop(true);
});
$('#btn_wiz_save').off().on('click', function () {
requestWriteConfig(wiz_editor.getValue());
stop(true);
});
wiz_editor.on("change", function (e) {
const val = wiz_editor.getEditor('root.color.channelAdjustment.' + profile + '').getValue();
const temp = JSON.parse(JSON.stringify(val));
delete temp.leds
requestAdjustment(JSON.stringify(temp), "", true);
});
step++
performAction();
}
return {
start: function () {
//create html
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>' + $.i18n('wiz_cc_title'));
$('#wizp1_body').html('<h4 style="font-weight:bold;text-transform:uppercase;">' + $.i18n('wiz_cc_title') + '</h4>' +
'<p>' + $.i18n('wiz_cc_intro1') + '</p>' +
'<label>' + $.i18n('wiz_cc_kwebs') + '</label>' +
'<input class="form-control" style="width:280px;margin:auto" id="wiz_cc_kodiip" type="text" placeholder="' + kodiAddress + '" value="' + kodiAddress + '" />' +
'<span id="kodi_status"></span><span id="multi_cali"></span>'
);
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont" disabled="disabled">' + '<i class="fa fa-fw fa-check"></i>' + $.i18n('general_btn_continue') + '</button>' +
'<button type="button" class="btn btn-danger" id="btn_wiz_cancel" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>'
);
$('#wizp2_body').html('<div id="wiz_cc_desc" style="font-weight:bold"></div><div id="editor_container_wiz"></div>'
);
$('#wizp2_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_back">' + '<i class="fa fa-fw fa-chevron-left"></i>' + $.i18n('general_btn_back') + '</button>' +
'<button type="button" class="btn btn-primary" id="btn_wiz_next">' + $.i18n('general_btn_next') + '<i style="margin-left:4px;"class="fa fa-fw fa-chevron-right"></i>' + '</button>' +
'<button type="button" class="btn btn-warning" id="btn_wiz_save" style="display:none"><i class="fa fa-fw fa-save"></i>' + $.i18n('general_btn_save') + '</button>' +
'<button type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>'
);
if (getStorage("darkMode") == "on")
$('#wizard_logo').prop("src", 'img/hyperion/logo_negativ.png');
//open modal
$("#wizard_modal").modal({
backdrop: "static",
keyboard: false,
show: true
});
setupEventListeners();
$('#wiz_cc_kodiip').trigger("change");
init();
initProfiles();
createEditor();
}
};
})();
export { colorCalibrationKodiWizard };

View File

@ -0,0 +1,143 @@
//****************************
// Wizard RGB byte order
//****************************
const rgbByteOrderWizard = (() => {
let wIntveralId;
let new_rgb_order;
function changeColor() {
let color = $("#wiz_canv_color").css('background-color');
if (color == 'rgb(255, 0, 0)') {
$("#wiz_canv_color").css('background-color', 'rgb(0, 255, 0)');
requestSetColor('0', '255', '0');
}
else {
$("#wiz_canv_color").css('background-color', 'rgb(255, 0, 0)');
requestSetColor('255', '0', '0');
}
}
function stopWizardRGB(reload) {
console.log("stopWizardRGB - reload: ", reload);
clearInterval(wIntveralId);
resetWizard(reload);
}
function beginWizardRGB() {
$("#wiz_switchtime_select").off().on('change', function () {
clearInterval(wIntveralId);
const time = $("#wiz_switchtime_select").val();
wIntveralId = setInterval(function () { changeColor(); }, time * 1000);
});
$('.wselect').on("change", function () {
let rgb_order = window.serverConfig.device.colorOrder.split("");
const redS = $("#wiz_r_select").val();
const greenS = $("#wiz_g_select").val();
const blueS = rgb_order.toString().replace(/,/g, "").replace(redS, "").replace(greenS, "");
for (const color of rgb_order) {
if (redS == color)
$('#wiz_g_select option[value=' + color + ']').prop('disabled', true);
else
$('#wiz_g_select option[value=' + color + ']').prop('disabled', false);
if (greenS == color)
$('#wiz_r_select option[value=' + color + ']').prop('disabled', true);
else
$('#wiz_r_select option[value=' + color + ']').prop('disabled', false);
}
if (redS != 'null' && greenS != 'null') {
$('#btn_wiz_save').prop('disabled', false);
for (let i = 0; i < rgb_order.length; i++) {
if (rgb_order[i] == "r")
rgb_order[i] = redS;
else if (rgb_order[i] == "g")
rgb_order[i] = greenS;
else
rgb_order[i] = blueS;
}
rgb_order = rgb_order.toString().replace(/,/g, "");
if (redS == "r" && greenS == "g") {
$('#btn_wiz_save').toggle(false);
$('#btn_wiz_checkok').toggle(true);
window.readOnlyMode ? $('#btn_wiz_checkok').prop('disabled', true) : $('#btn_wiz_checkok').prop('disabled', false);
}
else {
$('#btn_wiz_save').toggle(true);
window.readOnlyMode ? $('#btn_wiz_save').prop('disabled', true) : $('#btn_wiz_save').prop('disabled', false);
$('#btn_wiz_checkok').toggle(false);
}
new_rgb_order = rgb_order;
}
else
$('#btn_wiz_save').prop('disabled', true);
});
$("#wiz_switchtime_select").append(createSelOpt('5', '5'), createSelOpt('10', '10'), createSelOpt('15', '15'), createSelOpt('30', '30'));
$("#wiz_switchtime_select").trigger('change');
$("#wiz_r_select").append(createSelOpt("null", ""), createSelOpt('r', $.i18n('general_col_red')), createSelOpt('g', $.i18n('general_col_green')), createSelOpt('b', $.i18n('general_col_blue')));
$("#wiz_g_select").html($("#wiz_r_select").html());
$("#wiz_r_select").trigger('change');
requestSetColor('255', '0', '0');
setTimeout(requestSetSource, 100, 'auto');
setStorage("wizardactive", true);
$('#btn_wiz_abort').off().on('click', function () { stopWizardRGB(true); });
$('#btn_wiz_checkok').off().on('click', function () {
showInfoDialog('success', "", $.i18n('infoDialog_wizrgb_text'));
stopWizardRGB();
});
$('#btn_wiz_save').off().on('click', function () {
stopWizardRGB();
window.serverConfig.device.colorOrder = new_rgb_order;
requestWriteConfig({ "device": window.serverConfig.device });
});
}
return {
start: function () {
//create html
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>' + $.i18n('wiz_rgb_title'));
$('#wizp1_body').html('<h4 style="font-weight:bold;text-transform:uppercase;">' + $.i18n('wiz_rgb_title') + '</h4><p>' + $.i18n('wiz_rgb_intro1') + '</p><p style="font-weight:bold;">' + $.i18n('wiz_rgb_intro2') + '</p>');
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>' + $.i18n('general_btn_continue') + '</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>');
$('#wizp2_body').html('<p style="font-weight:bold">' + $.i18n('wiz_rgb_expl') + '</p>');
$('#wizp2_body').append('<div class="form-group"><label>' + $.i18n('wiz_rgb_switchevery') + '</label><div class="input-group" style="width:100px"><select id="wiz_switchtime_select" class="form-control"></select><div class="input-group-addon">' + $.i18n('edt_append_s') + '</div></div></div>');
$('#wizp2_body').append('<canvas id="wiz_canv_color" width="100" height="100" style="border-radius:60px;background-color:red; display:block; margin: 10px 0;border:4px solid grey;"></canvas><label>' + $.i18n('wiz_rgb_q') + '</label>');
$('#wizp2_body').append('<table class="table borderless" style="width:200px"><tbody><tr><td class="ltd"><label>' + $.i18n('wiz_rgb_qrend') + '</label></td><td class="itd"><select id="wiz_r_select" class="form-control wselect"></select></td></tr><tr><td class="ltd"><label>' + $.i18n('wiz_rgb_qgend') + '</label></td><td class="itd"><select id="wiz_g_select" class="form-control wselect"></select></td></tr></tbody></table>');
$('#wizp2_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_save"><i class="fa fa-fw fa-save"></i>' + $.i18n('general_btn_save') + '</button><button type="button" class="btn btn-primary" id="btn_wiz_checkok" style="display:none" data-dismiss="modal"><i class="fa fa-fw fa-check"></i>' + $.i18n('general_btn_ok') + '</button><button type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>');
if (getStorage("darkMode") == "on")
$('#wizard_logo').attr("src", 'img/hyperion/logo_negativ.png');
//open modal
$("#wizard_modal").modal({
backdrop: "static",
keyboard: false,
show: true
});
//listen for continue
$('#btn_wiz_cont').off().on('click', function () {
beginWizardRGB();
$('#wizp1').toggle(false);
$('#wizp2').toggle(true);
});
}
};
})();
export { rgbByteOrderWizard };

View File

@ -1,4 +1,4 @@
#!/bin/bash -e
#!/bin/bash
DOCKER="docker"
# Git repo url of Hyperion
@ -7,20 +7,21 @@ GIT_REPO_URL="https://github.com/hyperion-project/hyperion.ng.git"
REGISTRY_URL="ghcr.io/hyperion-project"
# cmake build type
BUILD_TYPE="Release"
# the docker image at GitHub Container Registry
BUILD_IMAGE="x86_64"
# the docker tag at GitHub Container Registry
BUILD_TAG="bullseye"
DISTRIBUTION="debian"
CODENAME="bullseye"
ARCHITECTURE="amd64"
# build packages (.deb .zip ...)
BUILD_PACKAGES=true
# packages string inserted to cmake cmd
PACKAGES=""
# platform string inserted to cmake cmd
BUILD_PLATFORM=""
#Run build with Qt6 or Qt5
BUILD_WITH_QT5=false
#Run build using GitHub code files
BUILD_LOCAL=0
BUILD_LOCAL=false
#Build from scratch
BUILD_INCREMENTAL=0
BUILD_INCREMENTAL=false
#Verbose output
_VERBOSE=0
#Additional args
@ -37,11 +38,7 @@ cd `dirname ${BASE_PATH}` > /dev/null
BASE_PATH=`pwd`;
popd > /dev/null
BASE_PATH=`pwd`;function log () {
if [[ $_V -eq 1 ]]; then
echo "$@"
fi
}
BASE_PATH=`pwd`;
set +e
${DOCKER} ps >/dev/null 2>&1
@ -62,8 +59,7 @@ function printHelp {
echo "########################################################
## A script to compile Hyperion inside a docker container
## Requires installed Docker: https://www.docker.com/
## Without arguments it will compile Hyperion for Debian Buster (x86_64) and uses Hyperion code from GitHub repository.
## Supports Raspberry Pi (armv6l, armv7l) cross compilation (Debian Stretch/Buster) and native compilation (Raspbian Stretch/Buster)
## Without arguments it will compile Hyperion for ${DISTRIBUTION}:${CODENAME}, ${ARCHITECTURE} architecture and uses Hyperion code from GitHub repository.
## For all images and tags currently available, see https://github.com/orgs/hyperion-project/packages
##
## Homepage: https://www.hyperion-project.org
@ -72,16 +68,17 @@ echo "########################################################
# These are possible arguments to modify the script behaviour with their default values
#
# docker-compile.sh -h, --help # Show this help message
# docker-compile.sh -i, --image # The docker image, e.g., x86_64, armv6l, armv7l, aarch64, rpi-raspbian
# docker-compile.sh -t, --tag # The docker tag, e.g., stretch, buster, bullseye, bookworm
# docker-compile.sh -n, --name # The distribution's codename, e.g., buster, bullseye, bookworm, jammy, trixie, lunar, mantic; Note: for Fedora it is the version number
# docker-compile.sh -a, --architecture # The output architecture, e.g., amd64, arm64, arm/v7
# docker-compile.sh -b, --type # Release or Debug build
# docker-compile.sh -p, --packages # If true, build packages with CPack
# docker-compile.sh --qt5 # Build with Qt5, otherwise build with Qt6
# docker-compile.sh -f, --platform # cmake PLATFORM parameter, e.g. x11, amlogic-dev
# docker-compile.sh -l, --local # Run build using local code files
# docker-compile.sh -c, --incremental # Run incremental build, i.e. do not delete files created during previous build
# docker-compile.sh -f, --platform # cmake PLATFORM parameter, e.g. x11, amlogic-dev
# docker-compile.sh -v, --verbose # Run the script in verbose mode
# docker-compile.sh -- args # Additonal cmake arguments, e.g., -DHYPERION_LIGHT=ON
# More informations to docker tags at: https://github.com/Hyperion-Project/hyperion.docker-ci"
# More informations to docker containers available at: https://github.com/Hyperion-Project/hyperion.docker-ci"
}
function log () {
@ -90,48 +87,63 @@ function log () {
fi
}
function check_distribution () {
url=${REGISTRY_URL}/$1:${CODENAME}
log "Check for distribution at: $url"
if $($DOCKER buildx imagetools inspect "$url" 2>&1 | grep -q $2) ; then
rc=0
else
rc=1
fi
return $rc
}
echo "Compile Hyperion using a Docker container"
options=$(getopt -l "image:,tag:,type:,packages:,platform:,local,incremental,verbose,help" -o "i:t:b:p:f:lcvh" -a -- "$@")
options=$(getopt -l "architecture:,name:,type:,packages:,platform:,qt5,local,incremental,verbose,help" -o "a:n:b:p:f:lcvh" -a -- "$@")
eval set -- "$options"
while true
do
case $1 in
-i|--image)
-a|--architecture)
shift
BUILD_IMAGE=$1
ARCHITECTURE=`echo $1 | tr '[:upper:]' '[:lower:]'`
;;
-t|--tag)
-n|--name)
shift
BUILD_TAG=$1
CODENAME=`echo $1 | tr '[:upper:]' '[:lower:]'`
;;
-b|--type)
-b|--type)
shift
BUILD_TYPE=$1
;;
-p|--packages)
-p|--packages)
shift
BUILD_PACKAGES=$1
;;
-f|--platform)
-f|--platform)
shift
BUILD_PLATFORM=$1
;;
-l|--local)
BUILD_LOCAL=1
--qt5)
BUILD_WITH_QT5=true
;;
-c|--incremental)
BUILD_INCREMENTAL=1
-l|--local)
BUILD_LOCAL=true
;;
-v|--verbose)
-i|--incremental)
BUILD_INCREMENTAL=true
;;
-v|--verbose)
_VERBOSE=1
;;
-h|--help)
-h|--help)
printHelp
exit 0
;;
--)
shift
shift
break;;
esac
shift
@ -141,7 +153,7 @@ BUILD_ARGS=$@
# determine package creation
if [ ${BUILD_PACKAGES} == "true" ]; then
PACKAGES="package"
PACKAGES="--target package"
fi
# determine platform cmake parameter
@ -149,13 +161,72 @@ if [[ ! -z ${BUILD_PLATFORM} ]]; then
PLATFORM="-DPLATFORM=${BUILD_PLATFORM}"
fi
echo "---> Initialize with IMAGE:TAG=${BUILD_IMAGE}:${BUILD_TAG}, BUILD_TYPE=${BUILD_TYPE}, BUILD_PACKAGES=${BUILD_PACKAGES}, PLATFORM=${BUILD_PLATFORM}, BUILD_LOCAL=${BUILD_LOCAL}, BUILD_INCREMENTAL=${BUILD_INCREMENTAL}"
PLATFORM_ARCHITECTURE="linux/"${ARCHITECTURE}
QTVERSION="5"
if [ ${BUILD_WITH_QT5} == false ]; then
QTVERSION="6"
CODENAME="${CODENAME}-qt6"
fi
echo "---> Evaluate distribution for codename:${CODENAME} on platform architecture ${PLATFORM_ARCHITECTURE}"
DISTRIBUTION="debian"
if ! check_distribution ${DISTRIBUTION} ${PLATFORM_ARCHITECTURE} ; then
DISTRIBUTION="ubuntu"
if ! check_distribution ${DISTRIBUTION} ${PLATFORM_ARCHITECTURE} ; then
DISTRIBUTION="fedora"
if ! check_distribution ${DISTRIBUTION} ${PLATFORM_ARCHITECTURE} ; then
echo "No docker image found for a distribution with codename: ${CODENAME} to be build on platform architecture ${PLATFORM_ARCHITECTURE}"
exit 1
fi
fi
fi
echo "---> Build with -> Distribution: ${DISTRIBUTION}, Codename: ${CODENAME}, Architecture: ${ARCHITECTURE}, Type: ${BUILD_TYPE}, Platform: ${BUILD_PLATFORM}, QT Version: ${QTVERSION}, Build Packages: ${BUILD_PACKAGES}, Build local: ${BUILD_LOCAL}, Build incremental: ${BUILD_INCREMENTAL}"
# Determine the current architecture
CURRENT_ARCHITECTURE=`uname -m`
#Test if multiarchitecture setup, i.e. user-space is 32bit
if [ ${CURRENT_ARCHITECTURE} == "aarch64" ]; then
CURRENT_ARCHITECTURE="arm64"
USER_ARCHITECTURE=$CURRENT_ARCHITECTURE
IS_V7L=`cat /proc/$$/maps |grep -m1 -c v7l`
if [ $IS_V7L -ne 0 ]; then
USER_ARCHITECTURE="arm/v7"
else
IS_V6L=`cat /proc/$$/maps |grep -m1 -c v6l`
if [ $IS_V6L -ne 0 ]; then
USER_ARCHITECTURE="arm/v6"
fi
fi
if [ $ARCHITECTURE != $USER_ARCHITECTURE ]; then
log "Identified user space current architecture: $USER_ARCHITECTURE"
CURRENT_ARCHITECTURE=$USER_ARCHITECTURE
fi
else
CURRENT_ARCHITECTURE=${CURRENT_ARCHITECTURE//x86_/amd}
fi
log "Identified kernel current architecture: $CURRENT_ARCHITECTURE"
if [ $ARCHITECTURE != $CURRENT_ARCHITECTURE ]; then
echo "---> Build is not for the same architecturem, enable emulation for ${PLATFORM_ARCHITECTURE}"
ENTRYPOINT_OPTION=
if [ $CURRENT_ARCHITECTURE != "amd64" ]; then
echo "---> Emulation builds can only be executed on linux/amd64, linux/x86_64 platforms, current architecture is ${CURRENT_ARCHITECTURE}"
exit 1
fi
else
log "Build natively for platform architecture: ${PLATFORM_ARCHITECTURE}"
ENTRYPOINT_OPTION="--entrypoint="""
fi
log "---> BASE_PATH = ${BASE_PATH}"
CODE_PATH=${BASE_PATH};
# get Hyperion source, cleanup previous folder
if [ ${BUILD_LOCAL} == 0 ]; then
if [ ${BUILD_LOCAL} == false ]; then
CODE_PATH="${CODE_PATH}/hyperion/"
echo "---> Downloading Hyperion source code from ${GIT_REPO_URL}"
@ -164,9 +235,11 @@ git clone --recursive --depth 1 -q ${GIT_REPO_URL} ${CODE_PATH} || { echo "--->
fi
log "---> CODE_PATH = ${CODE_PATH}"
BUILD_DIR="build-${BUILD_IMAGE}-${BUILD_TAG}"
ARCHITECTURE_PATH=${ARCHITECTURE//\//_}
BUILD_DIR="build-${CODENAME}-${ARCHITECTURE_PATH}"
BUILD_PATH="${CODE_PATH}/${BUILD_DIR}"
DEPLOY_DIR="deploy/${BUILD_IMAGE}/${BUILD_TAG}"
DEPLOY_DIR="deploy/${CODENAME}/${ARCHITECTURE}"
DEPLOY_PATH="${CODE_PATH}/${DEPLOY_DIR}"
log "---> BUILD_DIR = ${BUILD_DIR}"
@ -176,13 +249,13 @@ log "---> DEPLOY_PATH = ${DEPLOY_PATH}"
# cleanup deploy folder, create folder for ownership
sudo rm -fr "${DEPLOY_PATH}" >/dev/null 2>&1
mkdir -p "${DEPLOY_PATH}" >/dev/null 2>&1
sudo mkdir -p "${DEPLOY_PATH}" >/dev/null 2>&1
#Remove previous build area, if no incremental build
if [ ${BUILD_INCREMENTAL} != 1 ]; then
if [ ${BUILD_INCREMENTAL} != true ]; then
sudo rm -fr "${BUILD_PATH}" >/dev/null 2>&1
fi
mkdir -p "${BUILD_PATH}" >/dev/null 2>&1
sudo mkdir -p "${BUILD_PATH}" >/dev/null 2>&1
echo "---> Compiling Hyperion from source code at ${CODE_PATH}"
@ -195,13 +268,14 @@ echo "---> Compiling Hyperion from source code at ${CODE_PATH}"
# execute inside container all commands on bash
echo "---> Startup docker..."
$DOCKER run --rm \
$DOCKER run --rm --platform=${PLATFORM_ARCHITECTURE} \
${ENTRYPOINT_OPTION} \
-v "${DEPLOY_PATH}:/deploy" \
-v "${CODE_PATH}/:/source:rw" \
${REGISTRY_URL}/${BUILD_IMAGE}:${BUILD_TAG} \
${REGISTRY_URL}/${DISTRIBUTION}:${CODENAME} \
/bin/bash -c "mkdir -p /source/${BUILD_DIR} && cd /source/${BUILD_DIR} &&
cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${PLATFORM} ${BUILD_ARGS} .. || exit 2 &&
make -j $(nproc) ${PACKAGES} || exit 3 || : &&
cmake -G Ninja -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${PLATFORM} ${BUILD_ARGS} .. || exit 2 &&
cmake --build . ${PACKAGES} -- -j $(nproc) || exit 3 || : &&
exit 0;
exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 4; }
@ -211,13 +285,13 @@ DOCKERRC=${?}
sudo chown -fR $(stat -c "%U:%G" ${BASE_PATH}) ${BUILD_PATH}
if [ ${DOCKERRC} == 0 ]; then
if [ ${BUILD_LOCAL} == 1 ]; then
if [ ${BUILD_LOCAL} == true ]; then
echo "---> Find compiled binaries in: ${BUILD_PATH}/bin"
fi
if [ ${BUILD_PACKAGES} == "true" ]; then
echo "---> Copying packages to host folder: ${DEPLOY_PATH}" &&
cp -v ${BUILD_PATH}/Hyperion-* ${DEPLOY_PATH} 2>/dev/null
sudo cp -v ${BUILD_PATH}/Hyperion-* ${DEPLOY_PATH} 2>/dev/null
echo "---> Find deployment packages in: ${DEPLOY_PATH}"
sudo chown -fR $(stat -c "%U:%G" ${BASE_PATH}) ${DEPLOY_PATH}
fi

291
bin/scripts/install_pr.sh Executable file
View File

@ -0,0 +1,291 @@
#!/bin/bash
# Script for downloading a specific open Pull Request Artifact from Hyperion.NG
# Fixed variables
api_url="https://api.github.com/repos/hyperion-project/hyperion.ng"
type wget >/dev/null 2>/dev/null
hasWget=$?
type curl >/dev/null 2>/dev/null
hasCurl=$?
type python3 >/dev/null 2>/dev/null
hasPython3=$?
type python >/dev/null 2>/dev/null
hasPython2=$?
DISTRIBUTION="debian"
CODENAME="bullseye"
ARCHITECTURE=""
WITH_QT5=false
BASE_PATH='.'
if [[ "${hasWget}" -ne 0 ]] && [[ "${hasCurl}" -ne 0 ]]; then
echo '---> Critical Error: wget or curl required to download pull request artifacts'
exit 1
fi
if [[ "${hasPython3}" -eq 0 ]]; then
pythonCmd="python3"
else
if [[ "${hasPython2}" -eq 0 ]]; then
pythonCmd="python"
else
echo '---> Critical Error: python3 or python2 required to download pull request artifacts'
fi
exit 1
fi
function request_call() {
if [ $hasWget -eq 0 ]; then
echo $(wget --quiet --header="Authorization: token ${PR_TOKEN}" -O - $1)
elif [ $hasCurl -eq 0 ]; then
echo $(curl -skH "Authorization: token ${PR_TOKEN}" $1)
fi
}
while getopts ":a:c:r:t:5" opt; do
case "$opt" in
a) ARCHITECTURE=$OPTARG ;;
c) CONFIGDIR=$OPTARG ;;
r) run_id=$OPTARG ;;
t) PR_TOKEN=$OPTARG ;;
5) WITH_QT5=true ;;
esac
done
shift $((OPTIND - 1))
# Check for a command line argument (PR number)
if [ "$1" == "" ] || [ $# -gt 1 ] || [ -z ${PR_TOKEN} ]; then
echo "Usage: $0 -t <git_token> -a <architecture> -r <run_id> -c <hyperion config directory> <PR_NUMBER>" >&2
exit 1
else
pr_number="$1"
fi
# Set welcome message
echo '*******************************************************************************'
echo 'This script will download a specific open Pull Request Artifact from Hyperion.NG'
echo 'Created by hyperion-project.org - the official Hyperion source.'
echo '*******************************************************************************'
# Determine the architecture, if not given
if [[ -z ${ARCHITECTURE} ]]; then
ARCHITECTURE=$(uname -m)
fi
#Test if multiarchitecture setup, i.e. user-space is 32bit
if [[ "${ARCHITECTURE}" == "aarch64" ]]; then
ARCHITECTURE="arm64"
USER_ARCHITECTURE=$ARCHITECTURE
IS_ARMHF=$(grep -m1 -c armhf /proc/$$/maps)
if [ $IS_ARMHF -ne 0 ]; then
USER_ARCHITECTURE="armv7"
else
IS_ARMEL=$(grep -m1 -c armel /proc/$$/maps)
if [ $IS_ARMEL -ne 0 ]; then
USER_ARCHITECTURE="armv6"
fi
fi
if [ $ARCHITECTURE != $USER_ARCHITECTURE ]; then
echo "---> Identified user space target architecture: $USER_ARCHITECTURE"
ARCHITECTURE=$USER_ARCHITECTURE
fi
else
# Change x86_xx to amdxx
ARCHITECTURE=${ARCHITECTURE//x86_/amd}
# Remove 'l' from armv6l, armv7l
ARCHITECTURE=${ARCHITECTURE//l/}
fi
echo 'armv6 armv7 arm64 amd64' | grep -qw ${ARCHITECTURE}
if [ $? -ne 0 ]; then
echo "---> Critical Error: Target architecture $ARCHITECTURE is unknown -> abort"
exit 1
else
PACKAGE="${ARCHITECTURE}"
# armv6 has no Qt6 support yet
if [[ "${PACKAGE}" == "armv6" ]]; then
WITH_QT5=true
fi
QTVERSION="5"
if [ ${WITH_QT5} == false ]; then
QTVERSION="6"
PACKAGE="${PACKAGE}_qt6"
fi
echo "---> Download package for identified runtime architecture: $ARCHITECTURE and Qt$QTVERSION"
fi
# Determine if PR number exists
pulls=$(request_call "$api_url/pulls?state=open")
pr_exists=$(echo "$pulls" | tr '\r\n' ' ' | ${pythonCmd} -c """
import json,sys
data = json.load(sys.stdin)
for i in data:
if i['number'] == "$pr_number":
print('exists')
break
""" 2>/dev/null)
if [ "$pr_exists" != "exists" ]; then
echo "---> Pull Request $pr_number not found as open PR -> abort"
exit 1
fi
# Get head_sha value from 'pr_number'
head_sha=$(echo "$pulls" | tr '\r\n' ' ' | ${pythonCmd} -c """
import json,sys
data = json.load(sys.stdin)
for i in data:
if i['number'] == "$pr_number":
print(i['head']['sha'])
break
""" 2>/dev/null)
if [ -z "$head_sha" ]; then
echo "---> The specified PR #$pr_number has no longer any artifacts or has been closed."
echo "---> It may be older than 14 days or a new build currently in progress. Ask the PR creator to recreate the artifacts at the following URL:"
echo "---> https://github.com/hyperion-project/hyperion.ng/pull/$pr_number"
exit 1
fi
if [ -z "$run_id" ]; then
# Determine run_id from head_sha
runs=$(request_call "$api_url/actions/runs?head_sha=$head_sha")
run_id=$(echo "$runs" | tr '\r\n' ' ' | ${pythonCmd} -c """
import json,sys,os
data = json.load(sys.stdin)
for i in data['workflow_runs']:
if os.path.basename(i['path']) == 'push_pull.yml':
print(i['id'])
break
""" 2>/dev/null)
fi
if [ -z "$run_id" ]; then
echo "---> The specified PR #$pr_number has no longer any artifacts."
echo "---> It may be older than 14 days. Ask the PR creator to recreate the artifacts at the following URL:"
echo "---> https://github.com/hyperion-project/hyperion.ng/pull/$pr_number"
exit 1
fi
# Get archive_download_url from workflow
artifacts=$(request_call "$api_url/actions/runs/$run_id/artifacts")
PACKAGE_NAME=$(echo "$artifacts" | tr '\r\n' ' ' | ${pythonCmd} -c """
import json,sys, re
data = json.load(sys.stdin)
for i in data['artifacts']:
if re.match('.*{}$'.format(re.escape('$PACKAGE')), i['name']):
print(i['name'])
break
""" 2>/dev/null)
archive_download_url=$(echo "$artifacts" | tr '\r\n' ' ' | ${pythonCmd} -c """
import json,sys, re
data = json.load(sys.stdin)
for i in data['artifacts']:
if re.match('.*{}$'.format(re.escape('$PACKAGE')), i['name']):
print(i['archive_download_url'])
break
""" 2>/dev/null)
if [ -z "$archive_download_url" ]; then
echo "---> The specified PR #$pr_number has no longer any artifacts."
echo "---> It may be older than 14 days. Ask the PR creator to recreate the artifacts at the following URL:"
echo "---> https://github.com/hyperion-project/hyperion.ng/pull/$pr_number"
exit 1
fi
# Download packed PR artifact
echo "---> Downloading Pull Request #$pr_number, package: $PACKAGE_NAME"
if [ $hasCurl -eq 0 ]; then
curl -# -kH "Authorization: token ${PR_TOKEN}" -o $BASE_PATH/temp.zip -L --get $archive_download_url
elif [ $hasWget -eq 0 ]; then
echo "wget"
wget --quiet --header="Authorization: token ${PR_TOKEN}" -O $BASE_PATH/temp.zip $archive_download_url
fi
# Create new folder & extract PR artifact
echo "---> Extracting packed Artifact"
mkdir -p $BASE_PATH/hyperion_pr$pr_number
unzip -p $BASE_PATH/temp.zip | tar --strip-components=2 -C $BASE_PATH/hyperion_pr$pr_number share/hyperion/ -xz
# Delete PR artifact
echo '---> Remove temporary files'
rm $BASE_PATH/temp.zip 2>/dev/null
# Create the startup script
echo '---> Create startup script'
STARTUP_SCRIPT_STOPSRVS=$(
cat <<'EOF'
#!/bin/bash -e
# Stop hyperion service, if it is running
CURRENT_SERVICE=$(systemctl --type service | grep -o 'hyperion.*\.service' || true)
if [[ ! -z ${CURRENT_SERVICE} ]]; then
echo "---> Stop current service: ${CURRENT_SERVICE}"
STOPCMD="systemctl stop --quiet ${CURRENT_SERVICE} --now"
USERNAME=${SUDO_USER:-$(whoami)}
if [ ${USERNAME} != "root" ]; then
STOPCMD="sudo ${STOPCMD}"
fi
${STOPCMD} >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "---> Critical Error: Failed to stop service: ${CURRENT_SERVICE}, Hyperion may not be started. Stop Hyperion manually."
else
echo "---> Service ${CURRENT_SERVICE} successfully stopped, Hyperion will be started"
fi
fi
EOF
)
TARGET_CONFIGDIR="$BASE_PATH/config"
if [[ ! -z ${CONFIGDIR} ]]; then
STARTUP_SCRIPT_COPYCONFIG="$(
cat <<EOF
# Copy existing configuration file
echo "Copy existing configuration from ${CONFIGDIR}"
mkdir -p "$TARGET_CONFIGDIR"
cp -ri "${CONFIGDIR}"/* "$TARGET_CONFIGDIR"
EOF
)"
fi
STARTUP_SCRIPT_STARTPR="$(
cat <<EOF
# Start PR artifact
cd "$BASE_PATH/hyperion_pr$pr_number"
./bin/hyperiond -d -u "$TARGET_CONFIGDIR"
EOF
)"
# Place startup script
echo "${STARTUP_SCRIPT_STOPSRVS} ${STARTUP_SCRIPT_COPYCONFIG} ${STARTUP_SCRIPT_STARTPR}" >"$BASE_PATH/hyperion_pr$pr_number/$pr_number.sh"
# Set the executen bit
chmod +x -R $BASE_PATH/hyperion_pr$pr_number/$pr_number.sh
echo "*******************************************************************************"
echo "Download finished!"
$REBOOTMESSAGE
echo "You can test the pull request with this command: $BASE_PATH/hyperion_pr$pr_number/$pr_number.sh"
echo "Remove the test installation with: rm -R $BASE_PATH/hyperion_pr$pr_number"
echo "Feedback is welcome at https://github.com/hyperion-project/hyperion.ng/pull/$pr_number"
echo "*******************************************************************************"

View File

@ -70,7 +70,7 @@ if [[ ! -z ${CURRENT_SERVICE} ]]; then
exit 0;
fi
echo "Disable current service: ${CURRENT_SERVICE}"
systemctl is-active --quiet ${CURRENT_SERVICE} && systemctl disable --quiet ${CURRENT_SERVICE} --now >/dev/null 2>&1
systemctl disable --quiet ${CURRENT_SERVICE} --now >/dev/null 2>&1
fi
HYPERION="hyperion"
@ -84,9 +84,5 @@ NEW_SERVICE="${HYPERION}@${USERNAME}.service"
echo "Restarting Hyperion Service: ${NEW_SERVICE}"
systemctl enable --quiet ${NEW_SERVICE} --now >/dev/null 2>&1
# Update HyperBian splash screen
sed -i "s/${CURRENT_SERVICE}/${NEW_SERVICE}/" /etc/update-motd.d/10-hyperbian >/dev/null 2>&1
echo "Done."
exit 0

View File

@ -1,5 +1,5 @@
[Unit]
Description=Hyperion ambient light systemd service for user %i
Description=Hyperion ambient light systemd service for user %i
Documentation=https://docs.hyperion-project.org
Requisite=network.target
Wants=network-online.target

22
bin/service/hyperion.xml Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Hyperion</short>
<description>Hyperion.NG firewall rules</description>
<!-- HTTP -->
<port protocol="tcp" port="8090"/>
<!-- HTTPS -->
<port protocol="tcp" port="8892"/>
<!-- JSON Server -->
<port protocol="tcp" port="19444"/>
<!-- Flatbuffers Server -->
<port protocol="tcp" port="19400"/>
<!-- Protocol Buffers Server -->
<port protocol="tcp" port="19445"/>
<!-- Boblight Server -->
<port protocol="tcp" port="19333"/>
<include service="ssdp"/>
<include service="mdns"/>
</service>

View File

@ -14,7 +14,7 @@ macro(DeployMacOS TARGET)
install(CODE "set(PLUGIN_DIR \"${QT_PLUGIN_DIR}\")" COMPONENT "Hyperion")
install(CODE "set(BUILD_DIR \"${CMAKE_BINARY_DIR}\")" COMPONENT "Hyperion")
install(CODE "set(ENABLE_EFFECTENGINE \"${ENABLE_EFFECTENGINE}\")" COMPONENT "Hyperion")
install(CODE [[
file(GET_RUNTIME_DEPENDENCIES
@ -36,6 +36,7 @@ macro(DeployMacOS TARGET)
FILES "${dependency}"
DESTINATION "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/lib"
TYPE SHARED_LIBRARY
FOLLOW_SYMLINK_CHAIN
)
endif()
endforeach()
@ -45,7 +46,7 @@ macro(DeployMacOS TARGET)
MESSAGE("The following unresolved dependencies were discovered: ${unresolved_deps}")
endif()
foreach(PLUGIN "platforms" "sqldrivers" "imageformats")
foreach(PLUGIN "platforms" "sqldrivers" "imageformats" "tls")
if(EXISTS ${PLUGIN_DIR}/${PLUGIN})
file(GLOB files "${PLUGIN_DIR}/${PLUGIN}/*")
foreach(file ${files})
@ -60,6 +61,7 @@ macro(DeployMacOS TARGET)
DESTINATION "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/lib"
TYPE SHARED_LIBRARY
FILES ${DEPENDENCY}
FOLLOW_SYMLINK_CHAIN
)
endforeach()
@ -75,25 +77,27 @@ macro(DeployMacOS TARGET)
endif()
endforeach()
include(BundleUtilities)
include(BundleUtilities)
fixup_bundle("${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}" "${QT_PLUGINS}" "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/lib" IGNORE_ITEM "python;python3;Python;Python3;.Python;.Python3")
if(ENABLE_EFFECTENGINE)
# Detect the Python version and modules directory
find_package(Python3 3.5 REQUIRED)
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(standard_lib=True))"
OUTPUT_VARIABLE PYTHON_MODULES_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT CMAKE_VERSION VERSION_LESS "3.12")
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
set(PYTHON_VERSION_MAJOR_MINOR "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
set(PYTHON_MODULES_DIR ${Python3_STDLIB})
else()
find_package (PythonLibs ${PYTHON_VERSION_STRING} EXACT)
set(PYTHON_VERSION_MAJOR_MINOR "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}")
set(PYTHON_MODULES_DIR ${Python_STDLIB})
endif()
MESSAGE("Add Python ${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} to bundle")
MESSAGE("PYTHON_MODULES_DIR: ${PYTHON_MODULES_DIR}")
# Copy Python modules to '/../Frameworks/Python.framework/Versions/Current/lib/PythonMAJOR.MINOR' and ignore the unnecessary stuff listed below
if (PYTHON_MODULES_DIR)
set(PYTHON_VERSION_MAJOR_MINOR "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
file(
COPY ${PYTHON_MODULES_DIR}/
DESTINATION "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/Frameworks/Python.framework/Versions/Current/lib/python${PYTHON_VERSION_MAJOR_MINOR}"
@ -132,28 +136,33 @@ macro(DeployLinux TARGET)
include(GetPrerequisites)
set(SYSTEM_LIBS_SKIP
"libatomic"
"libc"
"libdbus"
"libdl"
"libexpat"
"libfontconfig"
"libfreetype"
"libgcc_s"
"libgcrypt"
"libGL"
"libGLdispatch"
"libglib"
"libglib-2"
"libGLX"
"libgpg-error"
"liblz4"
"liblzma"
"libm"
"libpcre"
"libpcre2"
"libpthread"
"librt"
"libstdc++"
"libsystemd"
"libudev"
"libusb"
"libusb-1"
"libutil"
"libX11"
"libuuid"
"libz"
)
)
if (ENABLE_DISPMANX)
list(APPEND SYSTEM_LIBS_SKIP "libcec")
@ -162,6 +171,8 @@ macro(DeployLinux TARGET)
# Extract dependencies ignoring the system ones
get_prerequisites(${TARGET_FILE} DEPENDENCIES 0 1 "" "")
message(STATUS "Dependencies for target file: ${DEPENDENCIES}")
# Append symlink and non-symlink dependencies to the list
set(PREREQUISITE_LIBS "")
foreach(DEPENDENCY ${DEPENDENCIES})
@ -203,6 +214,8 @@ macro(DeployLinux TARGET)
get_filename_component(file_canonical ${openssl_lib} REALPATH)
gp_append_unique(PREREQUISITE_LIBS ${file_canonical})
endforeach()
else()
message( WARNING "OpenSSL NOT found (https webserver will not work)")
endif(OPENSSL_FOUND)
# Detect the Qt plugin directory, source: https://github.com/lxde/lxqt-qtplugin/blob/master/src/CMakeLists.txt
@ -217,7 +230,7 @@ macro(DeployLinux TARGET)
# Copy Qt plugins to 'share/hyperion/lib'
if (QT_PLUGINS_DIR)
foreach(PLUGIN "platforms" "sqldrivers" "imageformats")
foreach(PLUGIN "platforms" "sqldrivers" "imageformats" "tls" "wayland-shell-integration")
if (EXISTS ${QT_PLUGINS_DIR}/${PLUGIN})
file(GLOB files "${QT_PLUGINS_DIR}/${PLUGIN}/*.so")
foreach(file ${files})
@ -266,15 +279,13 @@ macro(DeployLinux TARGET)
if(ENABLE_EFFECTENGINE)
# Detect the Python version and modules directory
if (NOT CMAKE_VERSION VERSION_LESS "3.12")
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
set(PYTHON_VERSION_MAJOR_MINOR "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
set(PYTHON_MODULES_DIR "${Python3_STDLIB}")
set(PYTHON_MODULES_DIR ${Python3_STDLIB})
else()
find_package (PythonLibs ${PYTHON_VERSION_STRING} EXACT)
set(PYTHON_VERSION_MAJOR_MINOR "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}")
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(standard_lib=True))"
OUTPUT_VARIABLE PYTHON_MODULES_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(PYTHON_MODULES_DIR ${Python_STDLIB})
endif()
# Copy Python modules to 'share/hyperion/lib/pythonMAJOR.MINOR' and ignore the unnecessary stuff listed below
@ -371,19 +382,25 @@ macro(DeployWindows TARGET)
list(GET openssl_versions 0 openssl_version_major)
list(GET openssl_versions 1 openssl_version_minor)
set(library_suffix "-${openssl_version_major}_${openssl_version_minor}")
set(open_ssl_version_suffix)
if (openssl_version_major VERSION_EQUAL 1 AND openssl_version_minor VERSION_EQUAL 1)
set(open_ssl_version_suffix "-1_1")
else()
set(open_ssl_version_suffix "-3")
endif()
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
string(APPEND library_suffix "-x64")
string(APPEND open_ssl_version_suffix "-x64")
endif()
find_file(OPENSSL_SSL
NAMES "libssl${library_suffix}.dll"
NAMES "libssl${open_ssl_version_suffix}.dll"
PATHS ${OPENSSL_INCLUDE_DIR}/.. ${OPENSSL_INCLUDE_DIR}/../bin
NO_DEFAULT_PATH
)
find_file(OPENSSL_CRYPTO
NAMES "libcrypto${library_suffix}.dll"
NAMES "libcrypto${open_ssl_version_suffix}.dll"
PATHS ${OPENSSL_INCLUDE_DIR}/.. ${OPENSSL_INCLUDE_DIR}/../bin
NO_DEFAULT_PATH
)

View File

@ -1,4 +1,4 @@
execute_process( COMMAND git config --global --add safe.directory "*" ERROR_QUIET )
execute_process( COMMAND git log -1 --format=%cn-%t/%h-%ct WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE BUILD_ID ERROR_QUIET )
execute_process( COMMAND sh -c "git branch | grep '^*' | sed 's;^*;;g' " WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE VERSION_ID ERROR_QUIET )
execute_process( COMMAND sh -c "git remote --verbose | grep origin | grep fetch | cut -f2 | cut -d' ' -f1" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_REMOTE_PATH ERROR_QUIET )

View File

@ -19,4 +19,10 @@ find_package_handle_standard_args(qmdnsengine
REQUIRED_VARS QMDNS_INCLUDE_DIR QMDNS_LIBRARIES
)
mark_as_advanced(QMDNS_INCLUDE_DIR QMDNS_LIBRARIES)
if(QMDNSENGINE_FOUND)
add_library(qmdnsengine STATIC IMPORTED GLOBAL)
set_target_properties(qmdnsengine PROPERTIES
IMPORTED_LOCATION ${QMDNS_LIBRARIES}
INTERFACE_INCLUDE_DIRECTORIES ${QMDNS_INCLUDE_DIR}
)
endif()

View File

@ -1,17 +0,0 @@
option(ENABLE_LDGOLD "Use GNU gold linker" ON)
set(LDGOLD_FOUND FALSE)
if(ENABLE_LDGOLD)
execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE LD_VERSION)
if(LD_VERSION MATCHES "GNU gold")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
set(LDGOLD_FOUND TRUE)
message(STATUS "Linker: GNU gold")
else()
message(STATUS "GNU gold linker is not available, falling back to default system linker")
endif()
else()
message(STATUS "Linker: Default system linker")
endif()

View File

@ -1,11 +1,10 @@
[Desktop Entry]
Name=Hyperion
GenericName=Hyperion Ambient Lighting
Comment=Hyperion mimics the well known Ambilight from Philips
Icon=/usr/share/pixmaps/hyperion/hyperiond_128.png
Comment=Hyperion is an opensource Bias or Ambient Lighting implementation
Icon=hyperion
Terminal=false
TryExec=hyperiond
Exec=hyperiond
Type=Application
StartupNotify=false
Categories=Application;

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (c) 2014-2023 Hyperion Project -->
<component type="desktop-application">
<id>com.hyperion-project.hyperion</id>
<metadata_license>MIT</metadata_license>
<project_license>MIT</project_license>
<name>Hyperion</name>
<summary>The successor to Hyperion aka Hyperion Next Generation.</summary>
<description>
<p>
Hyperion is an opensource Bias or Ambient Lighting implementation which you might know from TV manufacturers.
It supports many LED devices and video grabbers.
</p>
</description>
<url type="homepage">https://hyperion-project.org</url>
<url type="bugtracker">https://github.com/hyperion-project/hyperion.ng/issues</url>
<url type="help">https://hyperion-project.org</url>
<url type="faq">https://docs.hyperion-project.org/</url>
<url type="donation">https://www.paypal.me/HyperionAmbi</url>
<url type="translate">https://poeditor.com/join/project/Y4F6vHRFjA</url>
<releases>
<release version="2.0.15" date="2022-02-19" />
<release version="2.0.14" date="2022-11-27" />
<release version="2.0.13" date="2022-05-22" />
<release version="2.0.12" date="2021-11-21" />
</releases>
<screenshots>
<screenshot type="default">
<caption>The multi language web interface</caption>
<image>https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/doc/screenshot.png</image>
</screenshot>
</screenshots>
<categories>
<category>Application</category>
</categories>
<launchable type="desktop-id">com.hyperion-project.hyperion.desktop</launchable>
<developer_name>Hyperion Project</developer_name>
<update_contact>admin@hyperion-project.org</update_contact>
<content_rating type="oars-1.0" />
</component>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@ -26,13 +26,6 @@ install_file()
echo "--- Hyperion ambient light postinstall ---"
#check system
CPU_RPI=`grep -m1 -c 'BCM2708\|BCM2709\|BCM2710\|BCM2835\|BCM2836\|BCM2837\|BCM2711' /proc/cpuinfo`
CPU_X32X64=`uname -m | grep 'x86_32\|i686\|x86_64' | wc -l`
#Check for a bootloader as Berryboot
BOOT_BERRYBOOT=$(grep -m1 -c '\(/var/media\|/media/pi\)/berryboot' /etc/mtab)
#get current system ip
NET_IP=`hostname -I | cut -d " " -f1`
@ -47,7 +40,7 @@ if [ "$IS_UPGRADE" = false ]; then
then
# systemd
echo "---> init deamon: systemd"
FOUND_USR=`who | grep -o -m1 '^\w*\b'` || "root"
FOUND_USR=${SUDO_USER:-root}
install_file /usr/share/hyperion/service/hyperion.systemd /etc/systemd/system/hyperion@.service
systemctl enable hyperion"@${FOUND_USR}".service
START_MSG="--> systemctl start hyperion for user ${FOUND_USR}"
@ -103,36 +96,31 @@ ln -fs $BINSP/scripts/updateHyperionUser.sh $BINTP/updateHyperionUser 2>/dev/nul
# install desktop icons (only on initial installation and not upgrade)
if [ "$IS_UPGRADE" = false ]; then
if hash desktop-file-install 2>/dev/null; then
if [ ! -z "${DISPLAY}" ] || [ ! -z "${WAYLAND_DISPLAY}" ] || [ ! -z "${XDG_CURRENT_DESKTOP}" ]; then
echo "---> Install Hyperion desktop icons"
mkdir /usr/share/pixmaps/hyperion 2>/dev/null
cp /usr/share/hyperion/desktop/*.png /usr/share/pixmaps/hyperion 2>/dev/null
desktop-file-install /usr/share/hyperion/desktop/hyperiond.desktop 2>/dev/null
fi
fi
cp -R /usr/share/hyperion/icons/* /usr/share/icons/hicolor/ 2>/dev/null
cp /usr/share/hyperion/desktop/hyperion.metainfo.xml /usr/share/metainfo 2>/dev/null
# cleanup desktop icons
rm -r /usr/share/hyperion/desktop 2>/dev/null
#Check, if dtparam=spi=on is in place
if [ $CPU_RPI -eq 1 ]; then
BOOT_DIR="/boot"
if [ $BOOT_BERRYBOOT -eq 1 ]; then
BOOT_DIR=$(sed -ne "s#/dev/mmcblk0p1 \([^ ]*\) vfat rw,.*#\1#p" /etc/mtab)
fi
if [ -z "$BOOT_DIR" -o ! -f "$BOOT_DIR/config.txt" ]; then
echo '---> Warning: RPi using BERRYBOOT found but can not locate where config.txt is to enable SPI. (BOOT_DIR='"$BOOT_DIR)"
SPIOK=1 # Not sure if OK, but don't ask to reboot
else
SPIOK=`grep '^\dtparam=spi=on' "$BOOT_DIR/config.txt" | wc -l`
if [ $SPIOK -ne 1 ]; then
echo '---> Raspberry Pi found, but SPI is not set, we write "dtparam=spi=on" to '"$BOOT_DIR/config.txt"
sed -i '$a dtparam=spi=on' "$BOOT_DIR/config.txt"
REBOOTMESSAGE="echo Please reboot your Raspberry Pi, we inserted dtparam=spi=on to $BOOT_DIR/config.txt"
if [ -x "$(command -v desktop-file-install )" ]; then
desktop-file-install /usr/share/hyperion/desktop/hyperion.desktop 2>/dev/null
else
# On some systems this directory doesn't exist by default
mkdir -p /usr/share/applications
cp /usr/share/hyperion/desktop/hyperion.desktop /usr/share/applications
fi
# update desktop-database (if exists)
if [ -x "$(command -v update-desktop-database)" ]; then
update-desktop-database -q /usr/share/applications
update-desktop-database -q /usr/share/icons/hicolor
fi
fi
fi
# cleanup desktop and icons
rm -r /usr/share/hyperion/desktop 2>/dev/null
rm -r /usr/share/hyperion/icons 2>/dev/null
echo ${START_MSG}
echo "-----------------------------------------------------------------------------"
@ -149,7 +137,7 @@ $REBOOTMESSAGE
echo "-----------------------------------------------------------------------------"
echo "Webpage: www.hyperion-project.org"
echo "Forum: www.hyperion-project.org"
echo "Documenation: docs.hyperion-project.org"
echo "Documentation: docs.hyperion-project.org"
echo "-----------------------------------------------------------------------------"
@ -157,7 +145,7 @@ if [ -e /opt/hyperion/ ]
then
echo
echo "---------------------------------------------------------------------------------"
echo "- It seemd that you have an older version of hyperion installed in /opt/hyperion -"
echo "- It seems that you have an older version of hyperion installed in /opt/hyperion -"
echo "- please remove it to avoid problems -"
echo "---------------------------------------------------------------------------------"
fi

View File

@ -35,6 +35,11 @@ then
# disable user specific symlink
echo "---> Disable service and remove entry"
rm -v /etc/systemd/system/hyperion.service /etc/systemd/system/hyperiond@.service /etc/systemd/system/hyperion@.service 2> /dev/null
# reload daemon after updates
systemctl -q daemon-reload 2> /dev/null
# reset all units with failed status
systemctl -q reset-failed 2> /dev/null
elif [ -e /sbin/initctl ]
then
@ -59,11 +64,18 @@ fi
# In case we don't use a service kill all instances
killall hyperiond 2> /dev/null
# delete desktop icons; desktop-file-edit is a workaround to hide the entry and delete it afterwards manual.
# TODO Better way for deletion and keep the desktop in sync without logout/login or desktop dependend cmds?
echo "---> Delete Hyperion desktop icons"
desktop-file-edit --set-key=NoDisplay --set-value=true /usr/share/applications/hyperiond.desktop 2> /dev/null
echo "---> Remove Hyperion desktop icons"
# remove desktop/appstream file
rm -v /usr/share/applications/hyperion* 2> /dev/null
rm -rv /usr/share/pixmaps/hyperion 2> /dev/null
rm -v /usr/share/metainfo/hyperion* 2> /dev/null
# remove Hyperion icons
rm -v /usr/share/icons/hicolor/*/apps/hyperion.png 2> /dev/null
# update desktop-database (if exists)
if [ -x "$(command -v update-desktop-database)" ]; then
update-desktop-database -q /usr/share/applications
update-desktop-database -q /usr/share/icons/hicolor/
fi
exit 0

View File

@ -52,7 +52,7 @@ SET ( CPACK_PACKAGE_CONTACT "packages@hyperion-project.org")
SET ( CPACK_PACKAGE_VENDOR "hyperion-project")
SET ( CPACK_PACKAGE_EXECUTABLES "hyperiond;Hyperion" )
SET ( CPACK_PACKAGE_INSTALL_DIRECTORY "Hyperion" )
SET ( CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icons/hyperion-icon-32px.png" )
SET ( CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icons/hyperion-32px.png" )
SET ( CPACK_PACKAGE_VERSION_MAJOR "${HYPERION_VERSION_MAJOR}")
SET ( CPACK_PACKAGE_VERSION_MINOR "${HYPERION_VERSION_MINOR}")

View File

@ -1,15 +0,0 @@
# process a .rc file for windows
# Provides (BINARY_NAME)_WIN_RC_PATH with path to generated file
function(generate_win_rc_file BINARY_NAME)
# target path to store generated files
set(TARGET_PATH ${CMAKE_BINARY_DIR}/win_rc_file/${BINARY_NAME})
# assets
string(REPLACE "/" "\\\\" WIN_RC_ICON_PATH ${CMAKE_SOURCE_DIR}/cmake/nsis/installer.ico)
# configure the rc file
configure_file(
${CMAKE_SOURCE_DIR}/cmake/win/win.rc.in
${TARGET_PATH}/win.rc
)
# provide var for parent scope
set(${BINARY_NAME}_WIN_RC_PATH ${TARGET_PATH}/win.rc PARENT_SCOPE)
endfunction()

View File

@ -22,6 +22,24 @@
"enableAttemptsInterval": 15
},
"schedEvents": {
"enable": false
},
"cecEvents": {
"actions": [
{
"action": "Suspend",
"event": "standby"
},
{
"action": "Resume",
"event": "set stream path"
}
],
"enable": false
},
"color": {
"imageToLedMappingType": "multicolor_mean",
"channelAdjustment": [
@ -79,7 +97,6 @@
"blueSignalThreshold": 0,
"signalDetection": false,
"noSignalCounterThreshold": 200,
"cecDetection": false,
"sDVOffsetMin": 0.1,
"sDVOffsetMax": 0.9,
"sDHOffsetMin": 0.4,
@ -203,9 +220,7 @@
"internetAccessAPI": false,
"restirctedInternetAccessAPI": false,
"ipWhitelist": [],
"apiAuth": true,
"localApiAuth": false,
"localAdminAuth": true
"localApiAuth": false
},
"ledConfig": {
@ -248,5 +263,14 @@
"vmax": 0.08,
"vmin": 0
}
]
],
"osEvents": {
"suspendEnable": true,
"lockEnable": true
},
"cecEvents": {
"enable": false
}
}

12
debian/control.in vendored
View File

@ -1,12 +0,0 @@
Source: hyperion
Section: devel
Priority: optional
Build-Depends: @BUILD_DEPENDS@
Standards-Version: @STANDARDS_VERSION@
Maintainer: Hyperion Project <admin@hyperion-project.org>
Homepage: https://hyperion-project.org/
Package: hyperion
Architecture: @ARCHITECTURE@
Depends: @DEPENDS@
Description: Hyperion is an opensource Bias or Ambient Lighting implementation which you might know from TV manufactures. It supports many LED devices and video grabbers.

67
debian/distributions vendored
View File

@ -1,67 +0,0 @@
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Codename: bionic
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Codename: focal
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Codename: jammy
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Codename: kinetic
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Suite: oldoldstable
Codename: stretch
Architectures: armhf amd64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Suite: oldstable
Codename: buster
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Suite: stable
Codename: bullseye
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Suite: unstable
Codename: bookworm
Architectures: amd64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes

32
debian/rules.in vendored
View File

@ -1,32 +0,0 @@
#!/usr/bin/make -f
export DH_VERBOSE = 1
BUILDDIR = build
build:
mkdir $(BUILDDIR);
cd $(BUILDDIR); cmake @CMAKE_ENVIRONMENT@ -DCMAKE_INSTALL_PREFIX=../debian/tmp/usr ..
make -j4 -C $(BUILDDIR)
binary: binary-indep binary-arch
binary-indep:
binary-arch:
cd $(BUILDDIR); cmake -P cmake_install.cmake
rm -rf debian/tmp/usr/include debian/tmp/usr/lib debian/tmp/usr/bin/flatc
mkdir debian/tmp/DEBIAN
cp cmake/package-scripts/postinst debian/tmp/DEBIAN
chmod 0775 debian/tmp/DEBIAN/postinst
cp cmake/package-scripts/preinst debian/tmp/DEBIAN
chmod 0775 debian/tmp/DEBIAN/preinst
cp cmake/package-scripts/prerm debian/tmp/DEBIAN
chmod 0775 debian/tmp/DEBIAN/prerm
dpkg-gencontrol -phyperion
dpkg --build debian/tmp ..
rm -rf debian/tmp $(BUILDDIR)
clean:
rm -rf $(BUILDDIR)
.PHONY: build binary binary-arch binary-indep clean

View File

@ -1,26 +0,0 @@
cmake_minimum_required(VERSION 3.2)
project(qmdnsengine)
set(WORK_DIR "@QMDNS_WORK_DIR@")
set(SOURCE_DIR "@QMDNS_SOURCE_DIR@")
set(INSTALL_DIR "@QMDNS_INSTALL_DIR@")
set(CMAKE_ARGS "@QMDNS_CMAKE_ARGS@")
set(QMDNS_LOGGING "@QMDNS_LOGGING@")
include(ExternalProject)
ExternalProject_Add(qmdnsengine
PREFIX ${WORK_DIR}
BUILD_ALWAYS OFF
DOWNLOAD_COMMAND ""
SOURCE_DIR ${SOURCE_DIR}
INSTALL_DIR ${INSTALL_DIR}
CMAKE_ARGS ${CMAKE_ARGS}
LOG_DOWNLOAD ${QMDNS_LOGGING}
LOG_UPDATE ${QMDNS_LOGGING}
LOG_CONFIGURE ${QMDNS_LOGGING}
LOG_BUILD ${QMDNS_LOGGING}
LOG_INSTALL ${QMDNS_LOGGING}
LOG_TEST ${QMDNS_LOGGING}
)

View File

@ -21,49 +21,40 @@ endif()
if (ENABLE_MDNS)
set(USE_SYSTEM_QMDNS_LIBS ${DEFAULT_USE_SYSTEM_QMDNS_LIBS} CACHE BOOL "use qmdnsengine library from system")
if (USE_SYSTEM_QMDNS_LIBS)
if(USE_SYSTEM_QMDNS_LIBS)
find_package(qmdnsengine REQUIRED)
else ()
if (NOT DEFINED BUILD_QMDNS_ONCE)
set(BUILD_QMDNS_ONCE CACHE INTERNAL "Done")
set(QMDNS_WORK_DIR "${CMAKE_BINARY_DIR}/dependencies/external/qmdnsengine")
set(QMDNS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/qmdnsengine")
set(QMDNS_INSTALL_DIR ${CMAKE_BINARY_DIR})
set(QMDNS_CMAKE_ARGS
-DBUILD_SHARED_LIBS:BOOL=OFF
-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}
-DBIN_INSTALL_DIR:STRING=lib
-DLIB_INSTALL_DIR:STRING=lib
-DINCLUDE_INSTALL_DIR:STRING=include
-DCMAKE_PREFIX_PATH:PATH=${CMAKE_PREFIX_PATH}
-Wno-dev
)
else()
include(ExternalProject)
ExternalProject_Add(qmdns
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/external/qmdnsengine
BUILD_ALWAYS OFF
DOWNLOAD_COMMAND ""
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/qmdnsengine
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/qmdnsengine/bin
CMAKE_ARGS -DBUILD_SHARED_LIBS:BOOL=OFF
-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}
-DBIN_INSTALL_DIR:STRING=lib
-DLIB_INSTALL_DIR:STRING=lib
-DINCLUDE_INSTALL_DIR:STRING=include
-DCMAKE_PREFIX_PATH:PATH=${CMAKE_PREFIX_PATH}
-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-Wno-dev # We don't want to be warned over unused variables
INSTALL_DIR ${CMAKE_BINARY_DIR}
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/${CMAKE_STATIC_LIBRARY_PREFIX}qmdnsengine${CMAKE_STATIC_LIBRARY_SUFFIX}
)
if(${CMAKE_BUILD_TYPE} AND ${CMAKE_BUILD_TYPE} EQUAL "Debug")
set(QMDNS_LOGGING 1)
else ()
set(QMDNS_LOGGING 0)
endif ()
configure_file(${CMAKE_SOURCE_DIR}/dependencies/CMakeLists-qmdnsengine.txt.in ${QMDNS_WORK_DIR}/CMakeLists.txt @ONLY)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . WORKING_DIRECTORY ${QMDNS_WORK_DIR})
execute_process(COMMAND ${CMAKE_COMMAND} --build . --config "${CMAKE_BUILD_TYPE}" WORKING_DIRECTORY ${QMDNS_WORK_DIR})
endif()
set(QMDNS_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include")
if(WIN32)
set(QMDNS_LIBRARIES ${CMAKE_BINARY_DIR}/lib/qmdnsengine${CMAKE_STATIC_LIBRARY_SUFFIX})
else()
set(QMDNS_LIBRARIES ${CMAKE_BINARY_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}qmdnsengine${CMAKE_STATIC_LIBRARY_SUFFIX})
endif()
mark_as_advanced (QMDNS_INCLUDE_DIR QMDNS_LIBRARIES)
endif ()
set(QMDNS_INCLUDE_DIR ${QMDNS_INCLUDE_DIR} PARENT_SCOPE)
set(QMDNS_LIBRARIES ${QMDNS_LIBRARIES} PARENT_SCOPE)
include_directories(${QMDNS_INCLUDE_DIR})
add_library(qmdnsengine STATIC IMPORTED GLOBAL)
add_dependencies(qmdnsengine qmdns)
ExternalProject_Get_Property(qmdns INSTALL_DIR)
set_target_properties(qmdnsengine PROPERTIES
IMPORTED_LOCATION "${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}qmdnsengine${CMAKE_STATIC_LIBRARY_SUFFIX}"
INTERFACE_INCLUDE_DIRECTORIES "${INSTALL_DIR}/include"
)
endif()
endif()
#=============================================================================
@ -75,8 +66,18 @@ if(ENABLE_FLATBUF_SERVER OR ENABLE_FLATBUF_CONNECT)
if (USE_SYSTEM_FLATBUFFERS_LIBS)
find_program(FLATBUFFERS_FLATC_EXECUTABLE NAMES flatc REQUIRED)
find_package(Flatbuffers REQUIRED)
else ()
find_package(Flatbuffers QUIET)
if (NOT Flatbuffers_FOUND)
find_package(FlatBuffers QUIET)
if (NOT FlatBuffers_FOUND)
message(STATUS "Could not find Flatbuffers system library, build static Flatbuffers library")
set(DEFAULT_USE_SYSTEM_FLATBUFFERS_LIBS OFF PARENT_SCOPE)
set(USE_SYSTEM_FLATBUFFERS_LIBS OFF)
endif()
endif()
endif()
if (NOT USE_SYSTEM_FLATBUFFERS_LIBS)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared flatbuffers library")
set(FLATBUFFERS_BUILD_TESTS OFF CACHE BOOL "Build Flatbuffers with tests")
add_subdirectory(external/flatbuffers)
@ -134,6 +135,9 @@ endif()
if(ENABLE_PROTOBUF_SERVER)
set(USE_SYSTEM_PROTO_LIBS ${DEFAULT_USE_SYSTEM_PROTO_LIBS} CACHE BOOL "use protobuf library from system")
# defines for 3rd party sub-modules
set(ABSL_PROPAGATE_CXX_STD ON CACHE BOOL "Build abseil-cpp with C++ version requirements propagated")
if (USE_SYSTEM_PROTO_LIBS)
find_package(Protobuf REQUIRED)
if(CMAKE_VERSION VERSION_GREATER 3.5.2)
@ -160,6 +164,7 @@ if(ENABLE_PROTOBUF_SERVER)
# define the protobuf library
set(PROTOBUF_LIBRARIES protobuf::libprotobuf)
endif()
# redefine at parent scope
@ -266,7 +271,7 @@ if(ENABLE_DEV_NETWORK)
set(USE_SYSTEM_MBEDTLS_LIBS OFF)
endif (NOT MBEDTLS_FOUND)
else()
cmake_minimum_required(VERSION 3.2)
cmake_minimum_required(VERSION 3.5.1)
set(CMAKE_POLICY_DEFAULT_CMP0071 NEW)

View File

@ -1,11 +1,11 @@
/* ***********************************************************
* This file was automatically generated on 2013-12-19. *
* This file was automatically generated on 2023-11-30. *
* *
* Bindings Version 2.0.13 *
* C/C++ Bindings Version 2.1.33 *
* *
* If you have a bugfix for this file and want to commit it, *
* please fix the bug in the generator. You can find a link *
* to the generator git on tinkerforge.com *
* to the generators git repository on tinkerforge.com *
*************************************************************/
@ -15,9 +15,13 @@
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*FrameRenderedCallbackFunction)(uint16_t, void *);
typedef void (*FrameRendered_CallbackFunction)(uint16_t length, void *user_data);
#if defined _MSC_VER || defined __BORLANDC__
#pragma pack(push)
@ -26,7 +30,7 @@ typedef void (*FrameRenderedCallbackFunction)(uint16_t, void *);
#elif defined __GNUC__
#ifdef _WIN32
// workaround struct packing bug in GCC 4.7 on Windows
// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991
#define ATTRIBUTE_PACKED __attribute__((gcc_struct, packed))
#else
#define ATTRIBUTE_PACKED __attribute__((packed))
@ -42,66 +46,135 @@ typedef struct {
uint8_t r[16];
uint8_t g[16];
uint8_t b[16];
} ATTRIBUTE_PACKED SetRGBValues_;
} ATTRIBUTE_PACKED SetRGBValues_Request;
typedef struct {
PacketHeader header;
uint16_t index;
uint8_t length;
} ATTRIBUTE_PACKED GetRGBValues_;
} ATTRIBUTE_PACKED GetRGBValues_Request;
typedef struct {
PacketHeader header;
uint8_t r[16];
uint8_t g[16];
uint8_t b[16];
} ATTRIBUTE_PACKED GetRGBValuesResponse_;
} ATTRIBUTE_PACKED GetRGBValues_Response;
typedef struct {
PacketHeader header;
uint16_t duration;
} ATTRIBUTE_PACKED SetFrameDuration_;
} ATTRIBUTE_PACKED SetFrameDuration_Request;
typedef struct {
PacketHeader header;
} ATTRIBUTE_PACKED GetFrameDuration_;
} ATTRIBUTE_PACKED GetFrameDuration_Request;
typedef struct {
PacketHeader header;
uint16_t duration;
} ATTRIBUTE_PACKED GetFrameDurationResponse_;
} ATTRIBUTE_PACKED GetFrameDuration_Response;
typedef struct {
PacketHeader header;
} ATTRIBUTE_PACKED GetSupplyVoltage_;
} ATTRIBUTE_PACKED GetSupplyVoltage_Request;
typedef struct {
PacketHeader header;
uint16_t voltage;
} ATTRIBUTE_PACKED GetSupplyVoltageResponse_;
} ATTRIBUTE_PACKED GetSupplyVoltage_Response;
typedef struct {
PacketHeader header;
uint16_t length;
} ATTRIBUTE_PACKED FrameRenderedCallback_;
} ATTRIBUTE_PACKED FrameRendered_Callback;
typedef struct {
PacketHeader header;
uint32_t frequency;
} ATTRIBUTE_PACKED SetClockFrequency_;
} ATTRIBUTE_PACKED SetClockFrequency_Request;
typedef struct {
PacketHeader header;
} ATTRIBUTE_PACKED GetClockFrequency_;
} ATTRIBUTE_PACKED GetClockFrequency_Request;
typedef struct {
PacketHeader header;
uint32_t frequency;
} ATTRIBUTE_PACKED GetClockFrequencyResponse_;
} ATTRIBUTE_PACKED GetClockFrequency_Response;
typedef struct {
PacketHeader header;
} ATTRIBUTE_PACKED GetIdentity_;
uint16_t chip;
} ATTRIBUTE_PACKED SetChipType_Request;
typedef struct {
PacketHeader header;
} ATTRIBUTE_PACKED GetChipType_Request;
typedef struct {
PacketHeader header;
uint16_t chip;
} ATTRIBUTE_PACKED GetChipType_Response;
typedef struct {
PacketHeader header;
uint16_t index;
uint8_t length;
uint8_t r[12];
uint8_t g[12];
uint8_t b[12];
uint8_t w[12];
} ATTRIBUTE_PACKED SetRGBWValues_Request;
typedef struct {
PacketHeader header;
uint16_t index;
uint8_t length;
} ATTRIBUTE_PACKED GetRGBWValues_Request;
typedef struct {
PacketHeader header;
uint8_t r[12];
uint8_t g[12];
uint8_t b[12];
uint8_t w[12];
} ATTRIBUTE_PACKED GetRGBWValues_Response;
typedef struct {
PacketHeader header;
uint8_t mapping;
} ATTRIBUTE_PACKED SetChannelMapping_Request;
typedef struct {
PacketHeader header;
} ATTRIBUTE_PACKED GetChannelMapping_Request;
typedef struct {
PacketHeader header;
uint8_t mapping;
} ATTRIBUTE_PACKED GetChannelMapping_Response;
typedef struct {
PacketHeader header;
} ATTRIBUTE_PACKED EnableFrameRenderedCallback_Request;
typedef struct {
PacketHeader header;
} ATTRIBUTE_PACKED DisableFrameRenderedCallback_Request;
typedef struct {
PacketHeader header;
} ATTRIBUTE_PACKED IsFrameRenderedCallbackEnabled_Request;
typedef struct {
PacketHeader header;
uint8_t enabled;
} ATTRIBUTE_PACKED IsFrameRenderedCallbackEnabled_Response;
typedef struct {
PacketHeader header;
} ATTRIBUTE_PACKED GetIdentity_Request;
typedef struct {
PacketHeader header;
@ -111,7 +184,7 @@ typedef struct {
uint8_t hardware_version[3];
uint8_t firmware_version[3];
uint16_t device_identifier;
} ATTRIBUTE_PACKED GetIdentityResponse_;
} ATTRIBUTE_PACKED GetIdentity_Response;
#if defined _MSC_VER || defined __BORLANDC__
#pragma pack(pop)
@ -119,10 +192,18 @@ typedef struct {
#undef ATTRIBUTE_PACKED
static void led_strip_callback_wrapper_frame_rendered(DevicePrivate *device_p, Packet *packet) {
FrameRenderedCallbackFunction callback_function;
void *user_data = device_p->registered_callback_user_data[LED_STRIP_CALLBACK_FRAME_RENDERED];
FrameRenderedCallback_ *callback = (FrameRenderedCallback_ *)packet;
*(void **)(&callback_function) = device_p->registered_callbacks[LED_STRIP_CALLBACK_FRAME_RENDERED];
FrameRendered_CallbackFunction callback_function;
void *user_data;
FrameRendered_Callback *callback;
if (packet->header.length != sizeof(FrameRendered_Callback)) {
return; // silently ignoring callback with wrong length
}
callback_function = (FrameRendered_CallbackFunction)device_p->registered_callbacks[DEVICE_NUM_FUNCTION_IDS + LED_STRIP_CALLBACK_FRAME_RENDERED];
user_data = device_p->registered_callback_user_data[DEVICE_NUM_FUNCTION_IDS + LED_STRIP_CALLBACK_FRAME_RENDERED];
callback = (FrameRendered_Callback *)packet;
(void)callback; // avoid unused variable warning
if (callback_function == NULL) {
return;
@ -134,9 +215,10 @@ static void led_strip_callback_wrapper_frame_rendered(DevicePrivate *device_p, P
}
void led_strip_create(LEDStrip *led_strip, const char *uid, IPConnection *ipcon) {
IPConnectionPrivate *ipcon_p = ipcon->p;
DevicePrivate *device_p;
device_create(led_strip, uid, ipcon->p, 2, 0, 1);
device_create(led_strip, uid, ipcon_p, 2, 0, 3, LED_STRIP_DEVICE_IDENTIFIER);
device_p = led_strip->p;
@ -145,16 +227,26 @@ void led_strip_create(LEDStrip *led_strip, const char *uid, IPConnection *ipcon)
device_p->response_expected[LED_STRIP_FUNCTION_SET_FRAME_DURATION] = DEVICE_RESPONSE_EXPECTED_FALSE;
device_p->response_expected[LED_STRIP_FUNCTION_GET_FRAME_DURATION] = DEVICE_RESPONSE_EXPECTED_ALWAYS_TRUE;
device_p->response_expected[LED_STRIP_FUNCTION_GET_SUPPLY_VOLTAGE] = DEVICE_RESPONSE_EXPECTED_ALWAYS_TRUE;
device_p->response_expected[LED_STRIP_CALLBACK_FRAME_RENDERED] = DEVICE_RESPONSE_EXPECTED_ALWAYS_FALSE;
device_p->response_expected[LED_STRIP_FUNCTION_SET_CLOCK_FREQUENCY] = DEVICE_RESPONSE_EXPECTED_FALSE;
device_p->response_expected[LED_STRIP_FUNCTION_GET_CLOCK_FREQUENCY] = DEVICE_RESPONSE_EXPECTED_ALWAYS_TRUE;
device_p->response_expected[LED_STRIP_FUNCTION_SET_CHIP_TYPE] = DEVICE_RESPONSE_EXPECTED_FALSE;
device_p->response_expected[LED_STRIP_FUNCTION_GET_CHIP_TYPE] = DEVICE_RESPONSE_EXPECTED_ALWAYS_TRUE;
device_p->response_expected[LED_STRIP_FUNCTION_SET_RGBW_VALUES] = DEVICE_RESPONSE_EXPECTED_FALSE;
device_p->response_expected[LED_STRIP_FUNCTION_GET_RGBW_VALUES] = DEVICE_RESPONSE_EXPECTED_ALWAYS_TRUE;
device_p->response_expected[LED_STRIP_FUNCTION_SET_CHANNEL_MAPPING] = DEVICE_RESPONSE_EXPECTED_FALSE;
device_p->response_expected[LED_STRIP_FUNCTION_GET_CHANNEL_MAPPING] = DEVICE_RESPONSE_EXPECTED_ALWAYS_TRUE;
device_p->response_expected[LED_STRIP_FUNCTION_ENABLE_FRAME_RENDERED_CALLBACK] = DEVICE_RESPONSE_EXPECTED_TRUE;
device_p->response_expected[LED_STRIP_FUNCTION_DISABLE_FRAME_RENDERED_CALLBACK] = DEVICE_RESPONSE_EXPECTED_TRUE;
device_p->response_expected[LED_STRIP_FUNCTION_IS_FRAME_RENDERED_CALLBACK_ENABLED] = DEVICE_RESPONSE_EXPECTED_ALWAYS_TRUE;
device_p->response_expected[LED_STRIP_FUNCTION_GET_IDENTITY] = DEVICE_RESPONSE_EXPECTED_ALWAYS_TRUE;
device_p->callback_wrappers[LED_STRIP_CALLBACK_FRAME_RENDERED] = led_strip_callback_wrapper_frame_rendered;
ipcon_add_device(ipcon_p, device_p);
}
void led_strip_destroy(LEDStrip *led_strip) {
device_destroy(led_strip);
device_release(led_strip->p);
}
int led_strip_get_response_expected(LEDStrip *led_strip, uint8_t function_id, bool *ret_response_expected) {
@ -169,8 +261,8 @@ int led_strip_set_response_expected_all(LEDStrip *led_strip, bool response_expec
return device_set_response_expected_all(led_strip->p, response_expected);
}
void led_strip_register_callback(LEDStrip *led_strip, uint8_t id, void *callback, void *user_data) {
device_register_callback(led_strip->p, id, callback, user_data);
void led_strip_register_callback(LEDStrip *led_strip, int16_t callback_id, void (*function)(void), void *user_data) {
device_register_callback(led_strip->p, callback_id, function, user_data);
}
int led_strip_get_api_version(LEDStrip *led_strip, uint8_t ret_api_version[3]) {
@ -179,9 +271,15 @@ int led_strip_get_api_version(LEDStrip *led_strip, uint8_t ret_api_version[3]) {
int led_strip_set_rgb_values(LEDStrip *led_strip, uint16_t index, uint8_t length, uint8_t r[16], uint8_t g[16], uint8_t b[16]) {
DevicePrivate *device_p = led_strip->p;
SetRGBValues_ request;
SetRGBValues_Request request;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_SET_RGB_VALUES, device_p->ipcon_p, device_p);
if (ret < 0) {
@ -194,18 +292,23 @@ int led_strip_set_rgb_values(LEDStrip *led_strip, uint16_t index, uint8_t length
memcpy(request.g, g, 16 * sizeof(uint8_t));
memcpy(request.b, b, 16 * sizeof(uint8_t));
ret = device_send_request(device_p, (Packet *)&request, NULL);
ret = device_send_request(device_p, (Packet *)&request, NULL, 0);
return ret;
}
int led_strip_get_rgb_values(LEDStrip *led_strip, uint16_t index, uint8_t length, uint8_t ret_r[16], uint8_t ret_g[16], uint8_t ret_b[16]) {
DevicePrivate *device_p = led_strip->p;
GetRGBValues_ request;
GetRGBValuesResponse_ response;
GetRGBValues_Request request;
GetRGBValues_Response response;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_GET_RGB_VALUES, device_p->ipcon_p, device_p);
if (ret < 0) {
@ -215,25 +318,30 @@ int led_strip_get_rgb_values(LEDStrip *led_strip, uint16_t index, uint8_t length
request.index = leconvert_uint16_to(index);
request.length = length;
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response);
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response, sizeof(response));
if (ret < 0) {
return ret;
}
memcpy(ret_r, response.r, 16 * sizeof(uint8_t));
memcpy(ret_g, response.g, 16 * sizeof(uint8_t));
memcpy(ret_b, response.b, 16 * sizeof(uint8_t));
return ret;
}
int led_strip_set_frame_duration(LEDStrip *led_strip, uint16_t duration) {
DevicePrivate *device_p = led_strip->p;
SetFrameDuration_ request;
SetFrameDuration_Request request;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_SET_FRAME_DURATION, device_p->ipcon_p, device_p);
if (ret < 0) {
@ -242,67 +350,80 @@ int led_strip_set_frame_duration(LEDStrip *led_strip, uint16_t duration) {
request.duration = leconvert_uint16_to(duration);
ret = device_send_request(device_p, (Packet *)&request, NULL);
ret = device_send_request(device_p, (Packet *)&request, NULL, 0);
return ret;
}
int led_strip_get_frame_duration(LEDStrip *led_strip, uint16_t *ret_duration) {
DevicePrivate *device_p = led_strip->p;
GetFrameDuration_ request;
GetFrameDurationResponse_ response;
GetFrameDuration_Request request;
GetFrameDuration_Response response;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_GET_FRAME_DURATION, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response);
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response, sizeof(response));
if (ret < 0) {
return ret;
}
*ret_duration = leconvert_uint16_from(response.duration);
return ret;
}
int led_strip_get_supply_voltage(LEDStrip *led_strip, uint16_t *ret_voltage) {
DevicePrivate *device_p = led_strip->p;
GetSupplyVoltage_ request;
GetSupplyVoltageResponse_ response;
GetSupplyVoltage_Request request;
GetSupplyVoltage_Response response;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_GET_SUPPLY_VOLTAGE, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response);
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response, sizeof(response));
if (ret < 0) {
return ret;
}
*ret_voltage = leconvert_uint16_from(response.voltage);
return ret;
}
int led_strip_set_clock_frequency(LEDStrip *led_strip, uint32_t frequency) {
DevicePrivate *device_p = led_strip->p;
SetClockFrequency_ request;
SetClockFrequency_Request request;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_SET_CLOCK_FREQUENCY, device_p->ipcon_p, device_p);
if (ret < 0) {
@ -311,41 +432,287 @@ int led_strip_set_clock_frequency(LEDStrip *led_strip, uint32_t frequency) {
request.frequency = leconvert_uint32_to(frequency);
ret = device_send_request(device_p, (Packet *)&request, NULL);
ret = device_send_request(device_p, (Packet *)&request, NULL, 0);
return ret;
}
int led_strip_get_clock_frequency(LEDStrip *led_strip, uint32_t *ret_frequency) {
DevicePrivate *device_p = led_strip->p;
GetClockFrequency_ request;
GetClockFrequencyResponse_ response;
GetClockFrequency_Request request;
GetClockFrequency_Response response;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_GET_CLOCK_FREQUENCY, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response);
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response, sizeof(response));
if (ret < 0) {
return ret;
}
*ret_frequency = leconvert_uint32_from(response.frequency);
return ret;
}
int led_strip_set_chip_type(LEDStrip *led_strip, uint16_t chip) {
DevicePrivate *device_p = led_strip->p;
SetChipType_Request request;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_SET_CHIP_TYPE, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
request.chip = leconvert_uint16_to(chip);
ret = device_send_request(device_p, (Packet *)&request, NULL, 0);
return ret;
}
int led_strip_get_chip_type(LEDStrip *led_strip, uint16_t *ret_chip) {
DevicePrivate *device_p = led_strip->p;
GetChipType_Request request;
GetChipType_Response response;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_GET_CHIP_TYPE, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response, sizeof(response));
if (ret < 0) {
return ret;
}
*ret_chip = leconvert_uint16_from(response.chip);
return ret;
}
int led_strip_set_rgbw_values(LEDStrip *led_strip, uint16_t index, uint8_t length, uint8_t r[12], uint8_t g[12], uint8_t b[12], uint8_t w[12]) {
DevicePrivate *device_p = led_strip->p;
SetRGBWValues_Request request;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_SET_RGBW_VALUES, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
request.index = leconvert_uint16_to(index);
request.length = length;
memcpy(request.r, r, 12 * sizeof(uint8_t));
memcpy(request.g, g, 12 * sizeof(uint8_t));
memcpy(request.b, b, 12 * sizeof(uint8_t));
memcpy(request.w, w, 12 * sizeof(uint8_t));
ret = device_send_request(device_p, (Packet *)&request, NULL, 0);
return ret;
}
int led_strip_get_rgbw_values(LEDStrip *led_strip, uint16_t index, uint8_t length, uint8_t ret_r[12], uint8_t ret_g[12], uint8_t ret_b[12], uint8_t ret_w[12]) {
DevicePrivate *device_p = led_strip->p;
GetRGBWValues_Request request;
GetRGBWValues_Response response;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_GET_RGBW_VALUES, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
request.index = leconvert_uint16_to(index);
request.length = length;
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response, sizeof(response));
if (ret < 0) {
return ret;
}
memcpy(ret_r, response.r, 12 * sizeof(uint8_t));
memcpy(ret_g, response.g, 12 * sizeof(uint8_t));
memcpy(ret_b, response.b, 12 * sizeof(uint8_t));
memcpy(ret_w, response.w, 12 * sizeof(uint8_t));
return ret;
}
int led_strip_set_channel_mapping(LEDStrip *led_strip, uint8_t mapping) {
DevicePrivate *device_p = led_strip->p;
SetChannelMapping_Request request;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_SET_CHANNEL_MAPPING, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
request.mapping = mapping;
ret = device_send_request(device_p, (Packet *)&request, NULL, 0);
return ret;
}
int led_strip_get_channel_mapping(LEDStrip *led_strip, uint8_t *ret_mapping) {
DevicePrivate *device_p = led_strip->p;
GetChannelMapping_Request request;
GetChannelMapping_Response response;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_GET_CHANNEL_MAPPING, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response, sizeof(response));
if (ret < 0) {
return ret;
}
*ret_mapping = response.mapping;
return ret;
}
int led_strip_enable_frame_rendered_callback(LEDStrip *led_strip) {
DevicePrivate *device_p = led_strip->p;
EnableFrameRenderedCallback_Request request;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_ENABLE_FRAME_RENDERED_CALLBACK, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
ret = device_send_request(device_p, (Packet *)&request, NULL, 0);
return ret;
}
int led_strip_disable_frame_rendered_callback(LEDStrip *led_strip) {
DevicePrivate *device_p = led_strip->p;
DisableFrameRenderedCallback_Request request;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_DISABLE_FRAME_RENDERED_CALLBACK, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
ret = device_send_request(device_p, (Packet *)&request, NULL, 0);
return ret;
}
int led_strip_is_frame_rendered_callback_enabled(LEDStrip *led_strip, bool *ret_enabled) {
DevicePrivate *device_p = led_strip->p;
IsFrameRenderedCallbackEnabled_Request request;
IsFrameRenderedCallbackEnabled_Response response;
int ret;
ret = device_check_validity(device_p);
if (ret < 0) {
return ret;
}
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_IS_FRAME_RENDERED_CALLBACK_ENABLED, device_p->ipcon_p, device_p);
if (ret < 0) {
return ret;
}
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response, sizeof(response));
if (ret < 0) {
return ret;
}
*ret_enabled = response.enabled != 0;
return ret;
}
int led_strip_get_identity(LEDStrip *led_strip, char ret_uid[8], char ret_connected_uid[8], char *ret_position, uint8_t ret_hardware_version[3], uint8_t ret_firmware_version[3], uint16_t *ret_device_identifier) {
DevicePrivate *device_p = led_strip->p;
GetIdentity_ request;
GetIdentityResponse_ response;
GetIdentity_Request request;
GetIdentity_Response response;
int ret;
ret = packet_header_create(&request.header, sizeof(request), LED_STRIP_FUNCTION_GET_IDENTITY, device_p->ipcon_p, device_p);
@ -354,20 +721,22 @@ int led_strip_get_identity(LEDStrip *led_strip, char ret_uid[8], char ret_connec
return ret;
}
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response);
ret = device_send_request(device_p, (Packet *)&request, (Packet *)&response, sizeof(response));
if (ret < 0) {
return ret;
}
strncpy(ret_uid, response.uid, 8);
strncpy(ret_connected_uid, response.connected_uid, 8);
memcpy(ret_uid, response.uid, 8);
memcpy(ret_connected_uid, response.connected_uid, 8);
*ret_position = response.position;
memcpy(ret_hardware_version, response.hardware_version, 3 * sizeof(uint8_t));
memcpy(ret_firmware_version, response.firmware_version, 3 * sizeof(uint8_t));
*ret_device_identifier = leconvert_uint16_from(response.device_identifier);
return ret;
}
#ifdef __cplusplus
}
#endif

File diff suppressed because it is too large Load Diff

@ -1 +1 @@
Subproject commit 8468eab83bacc8bbd6cb5ae22197af06a9437b2d
Subproject commit 0100f6a5779831fa7a651e4b67ef389a8752bd9b

@ -1 +1 @@
Subproject commit 8c89224991adff88d53cd380f42a2baa36f91454
Subproject commit edb8fec9882084344a314368ac7fd957a187519c

@ -1 +1 @@
Subproject commit f0dc78d7e6e331b8c6bb2d5283e06aa26883ca7c
Subproject commit 7f94235e552599141950d7a4a3eaf93bc87d1b22

@ -1 +1 @@
Subproject commit 0ca80117e853671d909b3cec9e2bdcac85a13b9f
Subproject commit 4e54bc86c8ed2d4fa2e7449d4ba6a6a2742d9eb1

@ -1 +1 @@
Subproject commit 15330cb384aed2411ec7e42712ad4ed7af940877
Subproject commit 49086d3913367d2fb014a615f9d958a47867bc39

Some files were not shown because too many files have changed in this diff Show More