mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 03:06:37 +00:00
feature: new Module 74_AMAD to request Information and control Android Devices in cooperation with AutomagicApp on the Device (Forum #39773) (by M. Oldenburg)
git-svn-id: https://svn.fhem.de/fhem/trunk@9221 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
bdf87ffc18
commit
f43790cdfe
@ -1,5 +1,8 @@
|
||||
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
||||
# Do not insert empty lines here, update check depends on it.
|
||||
- feature: new Module 74_AMAD to request Information and control Android Devices
|
||||
in cooperation with AutomagicApp on the Device (Forum #39773)
|
||||
(by M. Oldenburg)
|
||||
- bugfix: 70_PushNotifier.pm: regex error handling
|
||||
- bugfix: 31_MilightDevice.pm: fixed bug that lead to crash on lost bridge connection, added module name prefix to round function
|
||||
- bugfix: 38_CO20.pm: removed unneccesary error messages due to USB timeout
|
||||
|
919
fhem/FHEM/74_AMAD.pm
Normal file
919
fhem/FHEM/74_AMAD.pm
Normal file
@ -0,0 +1,919 @@
|
||||
################################################################
|
||||
#
|
||||
# Developed with Kate
|
||||
#
|
||||
# (c) 2015 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
|
||||
# All rights reserved
|
||||
#
|
||||
# This script is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# any later version.
|
||||
#
|
||||
# The GNU General Public License can be found at
|
||||
# http://www.gnu.org/copyleft/gpl.html.
|
||||
# A copy is found in the textfile GPL.txt and important notices to the license
|
||||
# from the author is found in LICENSE.txt distributed with these scripts.
|
||||
#
|
||||
# This script is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
################################################################
|
||||
|
||||
|
||||
|
||||
|
||||
package main;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Time::HiRes qw(gettimeofday);
|
||||
|
||||
use HttpUtils;
|
||||
|
||||
my $version = "0.6.0";
|
||||
|
||||
|
||||
|
||||
sub AMAD_Initialize($) {
|
||||
|
||||
my ($hash) = @_;
|
||||
|
||||
$hash->{SetFn} = "AMAD_Set";
|
||||
$hash->{DefFn} = "AMAD_Define";
|
||||
$hash->{UndefFn} = "AMAD_Undef";
|
||||
$hash->{AttrFn} = "AMAD_Attr";
|
||||
$hash->{ReadFn} = "AMAD_Read";
|
||||
$hash->{AttrList} = "setOpenApp ".
|
||||
"setFullscreen:0,1 ".
|
||||
"setScreenOrientation:0,1 ".
|
||||
"setScreenBrightness:0,1 ".
|
||||
"fhemServerIP ".
|
||||
"root:0,1 ".
|
||||
"interval ".
|
||||
"port ".
|
||||
"disable:1 ";
|
||||
$hash->{AttrList} .= $readingFnAttributes;
|
||||
|
||||
|
||||
foreach my $d(sort keys %defs) {
|
||||
next if($defs{$d}{TYPE} ne "AMAD");
|
||||
$defs{$d}->{VERSION} = $version;
|
||||
}
|
||||
}
|
||||
|
||||
sub AMAD_Define($$) {
|
||||
|
||||
my ( $hash, $def ) = @_;
|
||||
my @a = split( "[ \t][ \t]*", $def );
|
||||
|
||||
return "too few parameters: define <name> AMAD <HOST>" if ( @a != 3 );
|
||||
|
||||
|
||||
my $name = $a[0];
|
||||
my $host = $a[2];
|
||||
my $port = 8090;
|
||||
my $interval = 180;
|
||||
|
||||
$hash->{HOST} = $host;
|
||||
$hash->{PORT} = $port;
|
||||
$hash->{INTERVAL} = $interval;
|
||||
$hash->{VERSION} = $version;
|
||||
$hash->{helper}{infoErrorCounter} = 0;
|
||||
$hash->{helper}{setCmdErrorCounter} = 0;
|
||||
|
||||
Log3 $name, 3, "AMAD ($name) - defined with host $hash->{HOST} on port $hash->{HOST} and interval $hash->{INTERVAL} (sec)";
|
||||
|
||||
AMAD_GetUpdateLocal( $hash );
|
||||
|
||||
InternalTimer( gettimeofday()+$hash->{INTERVAL}, "AMAD_GetUpdateTimer", $hash, 0 );
|
||||
|
||||
$hash->{STATE} = "initialized";
|
||||
readingsSingleUpdate ( $hash, "deviceState", "online", 0 );
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub AMAD_Undef($$) {
|
||||
|
||||
my ( $hash, $arg ) = @_;
|
||||
|
||||
RemoveInternalTimer( $hash );
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub AMAD_Attr(@) {
|
||||
|
||||
my ( $cmd, $name, $attrName, $attrVal ) = @_;
|
||||
my $hash = $defs{$name};
|
||||
|
||||
if( $attrName eq "disable" ) {
|
||||
if( $cmd eq "set" ) {
|
||||
if( $attrVal eq "0" ) {
|
||||
RemoveInternalTimer( $hash );
|
||||
InternalTimer( gettimeofday()+2, "AMAD_GetUpdateTimer", $hash, 0 ) if( $hash->{STATE} eq "disabled" );
|
||||
$hash->{STATE}='active';
|
||||
Log3 $name, 3, "AMAD ($name) - enabled";
|
||||
} else {
|
||||
$hash->{STATE} = 'disabled';
|
||||
RemoveInternalTimer( $hash );
|
||||
Log3 $name, 3, "AMAD ($name) - disabled";
|
||||
}
|
||||
}
|
||||
elsif( $cmd eq "del" ) {
|
||||
RemoveInternalTimer( $hash );
|
||||
InternalTimer( gettimeofday()+2, "AMAD_GetUpdateTimer", $hash, 0 ) if( $hash->{STATE} eq "disabled" );
|
||||
$hash->{STATE}='active';
|
||||
Log3 $name, 3, "AMAD ($name) - enabled";
|
||||
|
||||
} else {
|
||||
if($cmd eq "set") {
|
||||
$attr{$name}{$attrName} = $attrVal;
|
||||
Log3 $name, 3, "AMAD ($name) - $attrName : $attrVal";
|
||||
}
|
||||
elsif( $cmd eq "del" ) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( $attrName eq "interval" ) {
|
||||
if( $cmd eq "set" ) {
|
||||
if( $attrVal < 60 ) {
|
||||
Log3 $name, 3, "AMAD ($name) - interval too small, please use something > 60 (sec), default is 180 (sec)";
|
||||
return "interval too small, please use something > 60 (sec), default is 180 (sec)";
|
||||
} else {
|
||||
$hash->{INTERVAL} = $attrVal;
|
||||
Log3 $name, 3, "AMAD ($name) - set interval to $attrVal";
|
||||
}
|
||||
}
|
||||
elsif( $cmd eq "del" ) {
|
||||
$hash->{INTERVAL} = 180;
|
||||
Log3 $name, 3, "AMAD ($name) - set interval to default";
|
||||
|
||||
} else {
|
||||
if( $cmd eq "set" ) {
|
||||
$attr{$name}{$attrName} = $attrVal;
|
||||
Log3 $name, 3, "AMAD ($name) - $attrName : $attrVal";
|
||||
}
|
||||
elsif( $cmd eq "del" ) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( $attrName eq "port" ) {
|
||||
if( $cmd eq "set" ) {
|
||||
$hash->{PORT} = $attrVal;
|
||||
Log3 $name, 3, "AMAD ($name) - set port to $attrVal";
|
||||
}
|
||||
elsif( $cmd eq "del" ) {
|
||||
$hash->{PORT} = 8090;
|
||||
Log3 $name, 3, "AMAD ($name) - set port to default";
|
||||
|
||||
} else {
|
||||
if( $cmd eq "set" ) {
|
||||
$attr{$name}{$attrName} = $attrVal;
|
||||
Log3 $name, 3, "AMAD ($name) - $attrName : $attrVal";
|
||||
}
|
||||
elsif( $cmd eq "del" ) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub AMAD_GetUpdateLocal($) {
|
||||
|
||||
my ( $hash ) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
AMAD_RetrieveAutomagicInfo( $hash ) if( ReadingsVal( $name, "deviceState", "online" ) eq "online" && $hash->{STATE} ne "initialized" && AttrVal( $name, "disable", 0 ) ne "1" ); ### deviceState muß von Hand online/offline gesetzt werden z.B. über RESIDENZ Modul
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub AMAD_GetUpdateTimer($) {
|
||||
|
||||
my ( $hash ) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
AMAD_RetrieveAutomagicInfo( $hash ) if( ReadingsVal( $name, "deviceState", "online" ) eq "online" && AttrVal( $name, "disable", 0 ) ne "1" ); ### deviceState muß von Hand online/offline gesetzt werden z.B. über RESIDENZ Modul
|
||||
|
||||
InternalTimer( gettimeofday()+$hash->{INTERVAL}, "AMAD_GetUpdateTimer", $hash, 1 );
|
||||
Log3 $name, 4, "AMAD ($name) - Call AMAD_GetUpdateTimer";
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub AMAD_Set($$@) {
|
||||
|
||||
my ( $hash, $name, $cmd, @val ) = @_;
|
||||
my $apps = AttrVal( $name, "setOpenApp", "none" );
|
||||
|
||||
my $list = "";
|
||||
|
||||
$list .= "screenMsg ";
|
||||
$list .= "ttsMsg ";
|
||||
$list .= "volume:slider,0,1,15 ";
|
||||
$list .= "deviceState:online,offline ";
|
||||
$list .= "mediaPlayer:play,stop,next,back " if( AttrVal( $name, "fhemServerIP", "none" ) ne "none" );
|
||||
$list .= "screenBrightness:slider,0,1,255 " if( AttrVal( $name, "setScreenBrightness", "1" ) eq "1" );
|
||||
$list .= "screen:on,off ";
|
||||
$list .= "screenOrientation:auto,landscape,portrait " if( AttrVal( $name, "setScreenOrientation", "1" ) eq "1" );
|
||||
$list .= "screenFullscreen:on,off " if( AttrVal( $name, "setFullscreen", "1" ) eq "1" );
|
||||
$list .= "openURL ";
|
||||
$list .= "openApp:$apps " if( AttrVal( $name, "setOpenApp", "none" ) ne "none" );
|
||||
$list .= "nextAlarmTime:time ";
|
||||
$list .= "statusRequest:noArg ";
|
||||
$list .= "system:reboot " if( AttrVal( $name, "root", "1" ) eq "1" );
|
||||
|
||||
|
||||
if (lc $cmd eq 'screenmsg'
|
||||
|| lc $cmd eq 'ttsmsg'
|
||||
|| lc $cmd eq 'volume'
|
||||
|| lc $cmd eq 'mediaplayer'
|
||||
|| lc $cmd eq 'devicestate'
|
||||
|| lc $cmd eq 'screenbrightness'
|
||||
|| lc $cmd eq 'screenorientation'
|
||||
|| lc $cmd eq 'screenfullscreen'
|
||||
|| lc $cmd eq 'screen'
|
||||
|| lc $cmd eq 'openurl'
|
||||
|| lc $cmd eq 'openapp'
|
||||
|| lc $cmd eq 'nextalarmtime'
|
||||
|| lc $cmd eq 'system'
|
||||
|| lc $cmd eq 'statusrequest') {
|
||||
|
||||
Log3 $name, 5, "AMAD ($name) - set $name $cmd ".join(" ", @val);
|
||||
|
||||
return "set command only works if STATE not equal initialized, please wait for next interval run" if( $hash->{STATE} eq "initialized");
|
||||
return "Cannot set command, FHEM Device is disabled" if( AttrVal( $name, "disable", "0" ) eq "1" );
|
||||
|
||||
return AMAD_SelectSetCmd( $hash, $cmd, @val ) if( @val ) && ( ReadingsVal( $name, "deviceState", "online" ) eq "offline" ) && ( lc $cmd eq 'devicestate' );
|
||||
return "Cannot set command, FHEM Device is offline" if( ReadingsVal( $name, "deviceState", "online" ) eq "offline" );
|
||||
|
||||
return AMAD_SelectSetCmd( $hash, $cmd, @val ) if( @val ) || ( lc $cmd eq 'statusrequest' );
|
||||
}
|
||||
|
||||
return "Unknown argument $cmd, bearword as argument or wrong parameter(s), choose one of $list";
|
||||
}
|
||||
|
||||
sub AMAD_RetrieveAutomagicInfo($) {
|
||||
|
||||
my ($hash) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
my $host = $hash->{HOST};
|
||||
my $port = $hash->{PORT};
|
||||
my $fhemip = AttrVal( $name, "fhemServerIP", "none" );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/deviceInfo/"; # Path muß so im Automagic als http request Trigger drin stehen
|
||||
|
||||
HttpUtils_NonblockingGet(
|
||||
{
|
||||
url => $url,
|
||||
timeout => 5,
|
||||
hash => $hash,
|
||||
method => "GET",
|
||||
header => "fhemIP: $fhemip\r\nfhemDevice: $name",
|
||||
doTrigger => 1,
|
||||
callback => \&AMAD_RetrieveAutomagicInfoFinished,
|
||||
}
|
||||
);
|
||||
Log3 $name, 4, "AMAD ($name) - NonblockingGet get URL";
|
||||
Log3 $name, 4, "AMAD ($name) - AMAD_RetrieveAutomagicInfo: calling Host: $host";
|
||||
}
|
||||
|
||||
sub AMAD_RetrieveAutomagicInfoFinished($$$) {
|
||||
|
||||
my ( $param, $err, $data ) = @_;
|
||||
my $hash = $param->{hash};
|
||||
my $doTrigger = $param->{doTrigger};
|
||||
my $name = $hash->{NAME};
|
||||
my $host = $hash->{HOST};
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - AMAD_RetrieveAutomagicInfoFinished: processed request data";
|
||||
|
||||
|
||||
|
||||
### Begin Error Handling
|
||||
if( $hash->{helper}{infoErrorCounter} > 2 ) {
|
||||
readingsBeginUpdate( $hash );
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestState", "statusRequest_error" );
|
||||
|
||||
if( ReadingsVal( $name, "flow_Informations", "active" ) eq "inactive" && ReadingsVal( $name, "flow_SetCommands", "active" ) eq "inactive" ) {
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestError", "AMAD flows on your device inactive, please check your device" );
|
||||
|
||||
Log3 $name, 5, "AMAD ($name) - CHECK THE LAST ERROR READINGS FOR MORE INFO, DEVICE IS SET OFFLINE";
|
||||
|
||||
readingsBulkUpdate( $hash, "deviceState", "offline" );
|
||||
$hash->{STATE} = "AMAD Flows inactive, device set offline";
|
||||
}
|
||||
elsif( $hash->{helper}{infoErrorCounter} > 9 && $hash->{helper}{setCmdErrorCounter} > 4 ) {
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestError", "unknown error, please contact the developer" );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - UNKNOWN ERROR, PLEASE CONTACT THE DEVELOPER, DEVICE DISABLED";
|
||||
|
||||
$attr{$name}{disable} = 1;
|
||||
$hash->{STATE} = "Unknown Error, device disabled";
|
||||
$hash->{helper}{infoErrorCounter} = 0;
|
||||
$hash->{helper}{setCmdErrorCounter} = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
elsif( ReadingsVal( $name, "flow_Informations", "active" ) eq "inactive" ) {
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestError", "informations flow on your device is inactive, will try to reactivate" );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - Informations Flow on your Device is inactive, will try to reactivate";
|
||||
}
|
||||
elsif($hash->{helper}{infoErrorCounter} > 4 && ReadingsVal( $name, "flow_Informations", "active" ) eq "active" ){
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestError", "check automagicApp on your device" );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - Please check the AutomagicAPP on your Device";
|
||||
}
|
||||
elsif( $hash->{helper}{infoErrorCounter} > 9 ) {
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestError", "to many errors, check your network or device configuration" );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - To many Errors please check your Network or Device Configuration, DEVICE IS SET OFFLINE";
|
||||
|
||||
readingsBulkUpdate( $hash, "deviceState", "offline" );
|
||||
$hash->{STATE} = "To many Errors, device set offline";
|
||||
$hash->{helper}{infoErrorCounter} = 0;
|
||||
}
|
||||
readingsEndUpdate( $hash, 1 );
|
||||
}
|
||||
|
||||
if( defined( $err ) ) {
|
||||
if( $err ne "" ) {
|
||||
$hash->{STATE} = $err if( $hash->{STATE} ne "initialized" );
|
||||
$hash->{helper}{infoErrorCounter} = ( $hash->{helper}{infoErrorCounter} + 1 );
|
||||
|
||||
readingsBeginUpdate( $hash );
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestState", "statusRequest_error" );
|
||||
|
||||
if( $err =~ /timed out/ ) {
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestError", "connect to your device is timed out. check network ");
|
||||
}
|
||||
elsif( ( $err =~ /Keine Route zum Zielrechner/ ) && $hash->{helper}{infoErrorCounter} > 1 ) {
|
||||
readingsBulkUpdate( $hash,"lastStatusRequestError", "no route to target. bad network configuration or network is down ");
|
||||
} else {
|
||||
readingsBulkUpdate($hash, "lastStatusRequestError", "$err" );
|
||||
}
|
||||
|
||||
readingsEndUpdate( $hash, 1 );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - AMAD_RetrieveAutomagicInfoFinished: error while requesting AutomagicInfo: $err";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if( $data eq "" and exists( $param->{code} ) ) {
|
||||
$hash->{STATE} = $param->{code} if( $hash->{STATE} ne "initialized" );
|
||||
$hash->{helper}{infoErrorCounter} = ( $hash->{helper}{infoErrorCounter} + 1 );
|
||||
|
||||
readingsBeginUpdate( $hash );
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestState", "statusRequest_error" );
|
||||
|
||||
if( $param->{code} ne 200 ) {
|
||||
readingsBulkUpdate( $hash," lastStatusRequestError", "http Error ".$param->{code} );
|
||||
}
|
||||
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestError", "empty response, check automagicApp on your device" );
|
||||
readingsEndUpdate( $hash, 1 );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - AMAD_RetrieveAutomagicInfoFinished: received http code ".$param->{code}." without any data after requesting AMAD AutomagicInfo";
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if( ( $data =~ /Error/i ) and exists( $param->{code} ) ) {
|
||||
$hash->{STATE} = $param->{code} if( $hash->{STATE} ne "initialized" );
|
||||
$hash->{helper}{infoErrorCounter} = ( $hash->{helper}{infoErrorCounter} + 1 );
|
||||
|
||||
readingsBeginUpdate( $hash );
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestState", "statusRequest_error" );
|
||||
|
||||
if( $param->{code} eq 404 && ReadingsVal( $name, "flow_Informations", "inactive" ) eq "inactive" ) {
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestError", "check the informations flow on your device" );
|
||||
}
|
||||
elsif( $param->{code} eq 404 && ReadingsVal( $name, "flow_Informations", "active" ) eq "active" ) {
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestError", "check the automagicApp on your device" );
|
||||
} else {
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestError", "http error ".$param->{code} );
|
||||
}
|
||||
|
||||
readingsEndUpdate( $hash, 1 );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - AMAD_RetrieveAutomagicInfoFinished: received http code ".$param->{code}." receive Error after requesting AMAD AutomagicInfo";
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
### End Error Handling
|
||||
|
||||
$hash->{helper}{infoErrorCounter} = 0;
|
||||
|
||||
### Begin Response Processing
|
||||
$hash->{STATE} = "active" if( $hash->{STATE} eq "initialized" || $hash->{STATE} ne "active" );
|
||||
|
||||
my @valuestring = split( '@@@@', $data );
|
||||
my %buffer;
|
||||
foreach( @valuestring ) {
|
||||
my @values = split( '@@' , $_ );
|
||||
$buffer{$values[0]} = $values[1];
|
||||
}
|
||||
|
||||
|
||||
readingsBeginUpdate( $hash );
|
||||
|
||||
my $t;
|
||||
my $v;
|
||||
while( ( $t, $v ) = each %buffer ) {
|
||||
$v =~ s/null//g;
|
||||
readingsBulkUpdate( $hash, $t, $v ) if( defined( $v ) );
|
||||
}
|
||||
|
||||
readingsBulkUpdate( $hash, "lastStatusRequestState", "statusRequest_done" );
|
||||
|
||||
readingsEndUpdate( $hash, 1 );
|
||||
|
||||
$hash->{helper}{infoErrorCounter} = 0;
|
||||
### End Response Processing
|
||||
|
||||
$hash->{STATE} = "active" if( $hash->{STATE} eq "initialized" );
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub AMAD_HTTP_POST($$) {
|
||||
|
||||
my ( $hash, $url ) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
my $state = $hash->{STATE};
|
||||
|
||||
$hash->{STATE} = "Send HTTP POST";
|
||||
|
||||
HttpUtils_NonblockingGet(
|
||||
{
|
||||
url => $url,
|
||||
timeout => 5,
|
||||
hash => $hash,
|
||||
method => "POST",
|
||||
doTrigger => 1,
|
||||
callback => \&AMAD_HTTP_POSTerrorHandling,
|
||||
}
|
||||
);
|
||||
Log3 $name, 4, "AMAD ($name) - Send HTTP POST with URL $url";
|
||||
|
||||
$hash->{STATE} = $state;
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub AMAD_HTTP_POSTerrorHandling($$$) {
|
||||
|
||||
my ( $param, $err, $data ) = @_;
|
||||
my $hash = $param->{hash};
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
|
||||
### Begin Error Handling
|
||||
if( $hash->{helper}{setCmdErrorCounter} > 2 ) {
|
||||
readingsBeginUpdate( $hash );
|
||||
readingsBulkUpdate( $hash, "lastSetCommandState", "statusRequest_error" );
|
||||
|
||||
if( ReadingsVal( $name, "flow_Informations", "active" ) eq "inactive" && ReadingsVal( $name, "flow_SetCommands", "active" ) eq "inactive" ) {
|
||||
readingsBulkUpdate( $hash, "lastSetCommandError", "AMAD flows on your device inactive, please check your device" );
|
||||
Log3 $name, 5, "AMAD ($name) - CHECK THE LAST ERROR READINGS FOR MORE INFO, DEVICE IS SET OFFLINE";
|
||||
|
||||
readingsBulkUpdate( $hash, "deviceState", "offline" );
|
||||
$hash->{STATE} = "AMAD Flows inactive, device set offline";
|
||||
}
|
||||
elsif( $hash->{helper}{infoErrorCounter} > 9 && $hash->{helper}{setCmdErrorCounter} > 4 ) {
|
||||
readingsBulkUpdate($hash, "lastSetCommandError", "unknown error, please contact the developer" );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - UNKNOWN ERROR, PLEASE CONTACT THE DEVELOPER, DEVICE DISABLED";
|
||||
|
||||
$attr{$name}{disable} = 1;
|
||||
$hash->{STATE} = "Unknown Error, device disabled";
|
||||
$hash->{helper}{infoErrorCounter} = 0;
|
||||
$hash->{helper}{setCmdErrorCounter} = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
elsif( ReadingsVal( $name, "flow_SetCommands", "active" ) eq "inactive" ) {
|
||||
readingsBulkUpdate( $hash, "lastSetCommandError", "setCommands flow on your device is inactive, will try to reactivate" );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - Flow SetCommands on your Device is inactive, will try to reactivate";
|
||||
}
|
||||
elsif( $hash->{helper}{setCmdErrorCounter} > 4 && ReadingsVal( $name, "flow_SetCommands", "active" ) eq "active" ){
|
||||
readingsBulkUpdate( $hash, "lastSetCommandError", "check automagicApp on your device" );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - Please check the AutomagicAPP on your Device";
|
||||
}
|
||||
elsif( $hash->{helper}{setCmdErrorCounter} > 9 ) {
|
||||
readingsBulkUpdate( $hash, "lastSetCommandError", "to many errors, check your network or device configuration" );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - To many Errors please check your Network or Device Configuration, DEVICE IS SET OFFLINE";
|
||||
|
||||
readingsBulkUpdate( $hash, "deviceState", "offline" );
|
||||
$hash->{STATE} = "To many Errors, device set offline";
|
||||
$hash->{helper}{setCmdErrorCounter} = 0;
|
||||
}
|
||||
readingsEndUpdate( $hash, 1 );
|
||||
}
|
||||
|
||||
if( defined( $err ) ) {
|
||||
if( $err ne "" ) {
|
||||
$hash->{STATE} = $err if( $hash->{STATE} ne "initialized" );
|
||||
$hash->{helper}{setCmdErrorCounter} = ($hash->{helper}{setCmdErrorCounter} + 1);
|
||||
|
||||
readingsBeginUpdate( $hash );
|
||||
readingsBulkUpdate( $hash, "lastSetCommandState", "cmd_error" );
|
||||
|
||||
if( $err =~ /timed out/ ) {
|
||||
readingsBulkUpdate( $hash, "lastSetCommandError", "connect to your device is timed out. check network" );
|
||||
}
|
||||
elsif( $err =~ /Keine Route zum Zielrechner/ ) {
|
||||
readingsBulkUpdate( $hash, "lastSetCommandError", "no route to target. bad network configuration or network is down" );
|
||||
} else {
|
||||
readingsBulkUpdate( $hash, "lastSetCommandError", "$err" );
|
||||
}
|
||||
readingsEndUpdate( $hash, 1 );
|
||||
|
||||
Log3 $name, 5, "AMAD ($name) - AMAD_HTTP_POST: error while POST Command: $err";
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if( $data eq "" and exists( $param->{code} ) && $param->{code} ne 200 ) {
|
||||
$hash->{STATE} = $param->{code} if( $hash->{STATE} ne "initialized" );
|
||||
$hash->{helper}{setCmdErrorCounter} = ( $hash->{helper}{setCmdErrorCounter} + 1 );
|
||||
|
||||
readingsBeginUpdate( $hash );
|
||||
readingsBulkUpdate($hash, "lastSetCommandState", "cmd_error" );
|
||||
readingsBulkUpdate($hash, "lastSetCommandError", "http Error ".$param->{code} );
|
||||
readingsEndUpdate( $hash, 1 );
|
||||
|
||||
Log3 $name, 5, "AMAD ($name) - AMAD_HTTP_POST: received http code ".$param->{code};
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if( ( $data =~ /Error/i ) and exists( $param->{code} ) ) {
|
||||
$hash->{STATE} = $param->{code} if( $hash->{STATE} ne "initialized" );
|
||||
$hash->{helper}{setCmdErrorCounter} = ( $hash->{helper}{setCmdErrorCounter} + 1 );
|
||||
|
||||
readingsBeginUpdate( $hash );
|
||||
readingsBulkUpdate( $hash, "lastSetCommandState", "cmd_error" );
|
||||
|
||||
if( $param->{code} eq 404 ) {
|
||||
readingsBulkUpdate( $hash, "lastSetCommandError", "setCommands flow is inactive on your device!" );
|
||||
} else {
|
||||
readingsBulkUpdate( $hash, "lastSetCommandError", "http error ".$param->{code} );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
### End Error Handling
|
||||
|
||||
readingsSingleUpdate( $hash, "lastSetCommandState", "cmd_done", 1 );
|
||||
$hash->{helper}{setCmdErrorCounter} = 0;
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub AMAD_SelectSetCmd($$@) {
|
||||
|
||||
my ( $hash, $cmd, @data ) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
my $host = $hash->{HOST};
|
||||
my $port = $hash->{PORT};
|
||||
|
||||
if( lc $cmd eq 'screenmsg' ) {
|
||||
my $msg = join( " ", @data );
|
||||
|
||||
$msg =~ s/%/%25/g;
|
||||
$msg =~ s/\s/%20/g;
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/screenMsg?message=$msg";
|
||||
Log3 $name, 4, "AMAD ($name) - Sub AMAD_SetScreenMsg";
|
||||
|
||||
return AMAD_HTTP_POST( $hash,$url );
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'ttsmsg' ) {
|
||||
my $msg = join( " ", @data );
|
||||
|
||||
$msg =~ s/%/%25/g;
|
||||
$msg =~ s/\s/%20/g;
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/ttsMsg?message=$msg";
|
||||
|
||||
return AMAD_HTTP_POST( $hash,$url );
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'volume' ) {
|
||||
my $vol = join( " ", @data );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/setVolume?volume=$vol";
|
||||
|
||||
readingsSingleUpdate( $hash, $cmd, $vol, 1 );
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - Starte Update GetUpdateLocal";
|
||||
AMAD_GetUpdateLocal( $hash );
|
||||
|
||||
return AMAD_HTTP_POST( $hash, $url );
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'mediaplayer' ) {
|
||||
my $btn = join( " ", @data );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/mediaPlayer?button=$btn";
|
||||
|
||||
return AMAD_HTTP_POST( $hash,$url );
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'devicestate' ) {
|
||||
my $v = join( " ", @data );
|
||||
|
||||
readingsSingleUpdate( $hash, $cmd, $v, 1 );
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'screenbrightness' ) {
|
||||
my $bri = join( " ", @data );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/setBrightness?brightness=$bri";
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - Starte Update GetUpdateLocal";
|
||||
AMAD_GetUpdateLocal( $hash );
|
||||
|
||||
return AMAD_HTTP_POST( $hash,$url );
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'screen' ) {
|
||||
my $mod = join( " ", @data );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/setScreenOnOff?screen=$mod";
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - Starte Update GetUpdateLocal";
|
||||
AMAD_GetUpdateLocal( $hash );
|
||||
|
||||
return AMAD_HTTP_POST( $hash,$url );
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'screenorientation' ) {
|
||||
my $mod = join( " ", @data );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/setScreenOrientation?orientation=$mod";
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - Starte Update GetUpdateLocal";
|
||||
AMAD_GetUpdateLocal( $hash );
|
||||
|
||||
return AMAD_HTTP_POST( $hash,$url );
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'screenfullscreen' ) {
|
||||
my $mod = join( " ", @data );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/setScreenFullscreen?fullscreen=$mod";
|
||||
|
||||
readingsSingleUpdate( $hash, $cmd, $mod, 1 );
|
||||
|
||||
return AMAD_HTTP_POST( $hash, $url );
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'openurl' ) {
|
||||
my $openurl = join( " ", @data );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/openURL?url=$openurl";
|
||||
|
||||
return AMAD_HTTP_POST( $hash, $url );
|
||||
}
|
||||
|
||||
elsif (lc $cmd eq 'nextalarmtime') {
|
||||
my $alarmTime = join( " ", @data );
|
||||
my @alarm = split( ":", $alarmTime );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/setAlarm?hour=".$alarm[0]."&minute=".$alarm[1];
|
||||
|
||||
Log3 $name, 4, "AMAD ($name) - Starte Update GetUpdateLocal";
|
||||
AMAD_GetUpdateLocal( $hash );
|
||||
|
||||
return AMAD_HTTP_POST( $hash, $url );
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'statusrequest' ) {
|
||||
AMAD_GetUpdateLocal( $hash );
|
||||
return undef;
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'openapp' ) {
|
||||
my $app = join( " ", @data );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/openApp?app=$app";
|
||||
|
||||
return AMAD_HTTP_POST( $hash,$url );
|
||||
}
|
||||
|
||||
elsif( lc $cmd eq 'system' ) {
|
||||
my $systemcmd = join( " ", @data );
|
||||
|
||||
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/systemcommand?syscmd=$systemcmd";
|
||||
|
||||
return AMAD_HTTP_POST( $hash,$url );
|
||||
}
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
||||
|
||||
=pod
|
||||
=begin html
|
||||
|
||||
<a name="AMAD"></a>
|
||||
<h3>AMAD</h3>
|
||||
<ul>
|
||||
<u><b>AMAD - Automagic Android Device</b></u>
|
||||
At the moment no english documentation is available
|
||||
</ul>
|
||||
|
||||
=end html
|
||||
=begin html_DE
|
||||
|
||||
<a name="AMAD"></a>
|
||||
<h3>AMAD</h3>
|
||||
<ul>
|
||||
<u><b>AMAD - Automagic Android Device</b></u>
|
||||
Dieses Modul liefert, <b><u>in Verbindung mit der Android APP Automagic</u></b>, diverse Informationen von Android Geräten.
|
||||
Die AndroidAPP Automagic (welche nicht von mir stammt und 2.90Euro kostet) funktioniert wie Tasker, ist aber bei weitem User freundlicher.
|
||||
Im Auslieferiungszustand werden folgende Zustände dargestellt:
|
||||
<ul>
|
||||
<li>Zustand von Automagic auf dem Gerät</li>
|
||||
<li>Bluetooth An/Aus</li>
|
||||
<li>verbundene Bluetoothgeräte</li>
|
||||
<li>aktuell abgespieltes Musikalbum des verwendeten Mediaplayers</li>
|
||||
<li>aktuell abgespielter Musikinterpret des verwendeten Mediaplayers</li>
|
||||
<li>aktuell abgespielter Musiktitel des verwendeten Mediaplayers</li>
|
||||
<li>Status des Androidgerätes - Online/Offline</li>
|
||||
<li>nächster Alarmtag</li>
|
||||
<li>nächste Alarmzeit</li>
|
||||
<li>Batteriestatus in %</li>
|
||||
<li>Ladestatus - Netztei angeschlossen / nicht angeschlossen</li>
|
||||
<li>Bildschirnstatus An/Aus</li>
|
||||
<li>Bildschirmhelligkeit</li>
|
||||
<li>Vollbildmodus An/Aus</li>
|
||||
<li>Bildschirmausrichtung Auto/Landscape/Portrait</li>
|
||||
<li>Standardlautstärke</li>
|
||||
<li>Media Lautstärke des Lautsprechers am Gerät</li>
|
||||
<li>Media Lautstärke des Bluetooth Lautsprechers</li>
|
||||
</ul>
|
||||
<br>
|
||||
Mit etwas Einarbeitung können jegliche Informationen welche Automagic bereit stellt in FHEM angezeigt werden. Hierzu bedarf es lediglich
|
||||
einer kleinen Anpassung des "Informations" Flows
|
||||
<br><br>
|
||||
Das Modul gibt Dir auch die Möglichkeit Deine Androidgeräte zu steuern. So können folgende Aktionen durchgeführt werden.
|
||||
<ul>
|
||||
<li>Status des Gerätes (Online,Offline)</li>
|
||||
<li>Mediaplayer steuern (Play, Stop, nächster Titel, vorheriger Titel)</li>
|
||||
<li>nächste Alarmzeit setzen</li>
|
||||
<li>eine App auf dem Gerät öffnen</li>
|
||||
<li>eine URL im Browser öffnen</li>
|
||||
<li>Bildschirm An/Aus machen</li>
|
||||
<li>Bildschirmhelligkeit einstellen</li>
|
||||
<li>Vollbildmodus einschalten</li>
|
||||
<li>eine Nachricht senden welche am Bildschirm angezeigt wird</li>
|
||||
<li>Bildschirmausrichtung einstellen (Auto,Landscape,Portrait)</li>
|
||||
<li>neuen Statusreport des Gerätes anfordern</li>
|
||||
<li>Systembefehle setzen (Reboot)</li>
|
||||
<li>eine Nachricht senden welche <b>angesagt</b> wird (TTS)</li>
|
||||
<li>Medienlautstärke regeln</li>
|
||||
</ul>
|
||||
<br><br>
|
||||
Für all diese Aktionen und Informationen wird auf dem Androidgerät Automagic und ein so genannter Flow benötigt. Die App müßt
|
||||
Ihr Euch besorgen, die Flows bekommt Ihr von mir zusammen mit dem AMAD Modul.
|
||||
<br><br>
|
||||
<b>Wie genau verwendet man nun AMAD?</b>
|
||||
<ul>
|
||||
<li>installiert Euch die App "Automagic Premium" aus dem App Store oder die Testversion von <a href="https://automagic4android.com/de/testversion">hier</a></li>
|
||||
<li>installiert das Flowset 74_AMADautomagicFlows$VERSION.xml aus dem Ordner $INSTALLFHEM/FHEM/lib/ auf Eurem Androidgerät und aktiviert erstmal nur den "Informations" Flow.</li>
|
||||
</ul>
|
||||
<br>
|
||||
Nun müsst Ihr nur noch ein Device in FHEM anlegen.
|
||||
<br><br>
|
||||
<a name="AMADdefine"></a>
|
||||
<b>Define</b>
|
||||
<ul><br>
|
||||
<code>define <name> AMAD <IP-ADRESSE></code>
|
||||
<br><br>
|
||||
Beispiel:
|
||||
<ul><br>
|
||||
<code>define WandTabletWohnzimmer AMAD 192.168.0.23</code><br>
|
||||
</ul>
|
||||
<br>
|
||||
Diese Anweisung erstellt ein neues AMAD-Device. Der Parameter <IP-ADRESSE< legt die IP Adresse des Android Gerätes fest.<br>
|
||||
Das Standard Abfrageinterval ist 180 Sekunden und kann über das Attribut intervall geändert werden. Wer den Port ändern möchte, kann dies über
|
||||
das Attribut port tun. <b>Ihr solltet aber wissen was Ihr tut, da dieser Port im HTTP Response Trigger der beiden Flows eingestellt ist. Demzufolge muß dieser dort
|
||||
auch verädert werden.</b><br>
|
||||
</ul>
|
||||
<br><br>
|
||||
<b><u>Fertig! Nach anlegen der Geräteinstanz sollten nach spätestens 3 Minuten bereits die ersten Readings reinkommen.</u></b>
|
||||
<br><br>
|
||||
<a name="AMADreadings"></a>
|
||||
<b>Readings</b>
|
||||
<ul>
|
||||
<li>automagicState - Statusmeldungen von der AutomagicApp</li>
|
||||
<li>bluetooth on/off - ist auf dem Gerät Bluetooth an oder aus</li>
|
||||
<li>connectedBTdevices - eine Lieste der verbundenen Gerät</li>
|
||||
<li>currentMusicAlbum - aktuell abgespieltes Musikalbum des verwendeten Mediaplayers</li>
|
||||
<li>currentMusicArtist - aktuell abgespielter Musikinterpret des verwendeten Mediaplayers</li>
|
||||
<li>currentMusicTrack - aktuell abgespielter Musiktitel des verwendeten Mediaplayers</li>
|
||||
<li>deviceState - Status des Androidgerätes, muss selbst mit setreading gesetzt werden z.B. über die Anwesenheitskontrolle.<br>
|
||||
Ist Offline gesetzt, wird der Intervall zum Informationsabruf aus gesetzt.</li>
|
||||
<li>flow_SetCommands active/inactive - gibt den Status des SetCommands Flow wieder</li>
|
||||
<li>flow_informations active/inactive - gibt den Status des Informations Flow wieder</li>
|
||||
<li>lastSetCommandError - letzte Fehlermeldung vom set Befehl</li>
|
||||
<li>lastSetCommandState - letzter Status vom set Befehl, Befehl erfolgreich/nicht erfolgreich gesendet</li>
|
||||
<li>lastStatusRequestError - letzte Fehlermeldung vom statusRequest Befehl</li>
|
||||
<li>lastStatusRequestState - letzter Status vom statusRequest Befehl, Befehl erfolgreich/nicht erfolgreich gesendet</li>
|
||||
<li>nextAlarmDay - aktiver Alarmtag</li>
|
||||
<li>nextAlarmTime - aktive Alarmzeit</li>
|
||||
<li>powerLevel - Status der Batterie in %</li>
|
||||
<li>powerPlugged - Netzteil angeschlossen? 0=NEIN, 2=JA</li>
|
||||
<li>screen - Bildschirm An oderAus</li>
|
||||
<li>screenBrightness - Bildschirmhelligkeit von 0-255</li>
|
||||
<li>screenFullscreen - Vollbildmodus (On,Off)</li>
|
||||
<li>screenOrientation - Bildschirmausrichtung (Auto,Landscape,Portrait)</li>
|
||||
<li>volume - Lautstärkewert welcher über "set volume" gesetzt wurde.</li>
|
||||
<li>volumeMusikBluetooth - Media Lautstärke von angeschlossenden Bluetooth Lautsprechern</li>
|
||||
<li>volumeMusikSpeaker - Media Lautstärke der internen Lautsprecher</li>
|
||||
<br>
|
||||
Die Readings volumeMusikBluetooth und volumeMusikSpeaker spiegeln die jeweilige Medialautstärke der angeschlossenden Bluetoothlautsprechern oder der internen Lautsprecher wieder.<br>
|
||||
Sofern man die jeweiligen Lautstärken ausschließlich über den Set Befehl setzt, wird eine der beiden immer mit dem "volume" Reading über ein stimmen.<br><br>
|
||||
</ul>
|
||||
<br><br>
|
||||
<a name="AMADset"></a>
|
||||
<b>Set</b>
|
||||
<ul>
|
||||
<li>deviceState - setzt den Device Status Online/Offline. Siehe Readings</li>
|
||||
<li>mediaPlayer - steuert den Standard Mediaplayer. play, stop, Titel zürück, Titel vor.</li>
|
||||
<li>nextAlarmTime - setzt die Alarmzeit. Geht aber nur innerhalb der nächsten 24Std.</li>
|
||||
<li>openURL - öffnet eine URL im Standardbrowser</li>
|
||||
<li>screen - setzt den Bildschirm on/off mit Sperre, in den Automagic Einstellungen muss "Admin Funktion" gesetzt werden sonst funktioniert "Screen off" nicht.</li>
|
||||
<li>screenMsg - versendet eine Bildschirmnachricht</li>
|
||||
<li>statusRequest - Fordert einen neuen Statusreport beim Device an</li>
|
||||
<li>ttsMsg - versendet eine Nachricht welche als Sprachnachricht ausgegeben wird</li>
|
||||
<li>volume - setzt die Medialautstärke. Entweder die internen Lautsprecher oder sofern angeschlossen die Bluetoothlautsprecher</li>
|
||||
</ul>
|
||||
<br>
|
||||
<b>Set abhängig von gesetzten Attributen</b>
|
||||
<ul>
|
||||
<li>mediaPlayer - steuert den Standard Mediaplayer. play, stop, Titel zürück, Titel vor. <b>Attribut fhemServerIP</b></li>
|
||||
<li>openApp - öffnet eine ausgewählte App. <b>Attribut setOpenApp</b></li>
|
||||
<li>screenBrightness - setzt die Bildschirmhelligkeit, von 0-255 <b>Attribut setScreenBrightness</b></li>
|
||||
Wenn Ihr das "set screenBrightness" verwenden wollt, muss eine kleine Anpassung im Flow SetCommands vorgenommen werden. Öffnet die Aktion (eines der Vierecke ganz ganz unten)
|
||||
SetzeSystemeinstellung:System und macht einen Haken bei "Ich habe die Einstellungen überprüft, ich weiss was ich tue".
|
||||
<li>screenFullscreen - Schaltet den Vollbildmodus on/off. <b>Attribut setFullscreen</b></li>
|
||||
<li>screenOrientation - Schaltet die Bildschirmausrichtung Auto/Landscape/Portait. <b>Attribut setScreenOrientation</b></li>
|
||||
<li>system - setzt Systembefehle ab (nur bei gerootetet Geräen). Reboot <b>Attribut root</b>, in den Automagic Einstellungen muss "Root Funktion" gesetzt werden</li>
|
||||
Um openApp verwenden zu können, muss als Attribut ein, oder durch Komma getrennt, mehrere App Namen gesetzt werden. Der App Name ist frei wählbar und nur zur Wiedererkennung notwendig.
|
||||
Der selbe App Name muß im Flow SetCommands auf der linken Seite unterhalb der Raute Expression:"openApp" in einen der 5 Stränge (eine App pro Strang) in beide Rauten eingetragen werden. Danach wird
|
||||
in das
|
||||
Viereck die App ausgewält welche durch den Attribut App Namen gestartet werden soll.
|
||||
</ul>
|
||||
<br><br>
|
||||
<a name="AMADstate"></a>
|
||||
<b>STATE</b>
|
||||
<ul>
|
||||
<li>initialized - Ist der Status kurz nach einem define..</li>
|
||||
<li>active - die Geräteinstanz ist im aktiven Status.</li>
|
||||
<li>disabled - die Geräteinstanz wurde über das Attribut disable deaktiviert</li>
|
||||
</ul>
|
||||
<br><br><br>
|
||||
<u><b>Anwendungsbeispiele:</b></u>
|
||||
<ul><br>
|
||||
Ich habe die Ladegeräte für meine Androidgeräte an Funkschaltsteckdosen. ein DOIF schaltet bei unter 30% die Steckdose ein und bei über 90% wieder aus. Morgens lasse ich mich
|
||||
über mein Tablet im Schlafzimmer mit Musik wecken. Verwendet wird hierzu der wakeuptimer des RESIDENTS Modules. Das abspielen stoppe ich dann von Hand. Danach erfolgt noch eine
|
||||
Ansage wie das Wetter gerade ist und wird.<br>
|
||||
Mein 10" Tablet im Wohnzimmer ist Mediaplayer für das Wohnzimmer mit Bluetoothlautsprechern. Die Lautstärke wird automatisch runter gesetzt wenn die Fritzbox einen Anruf auf das
|
||||
Wohnzimmer Handgerät signalisiert.
|
||||
</ul>
|
||||
<br><br><br>
|
||||
<b><u>Und zu guter letzt möchte ich mich noch bedanken.</u><br>
|
||||
Der größte Dank geht an meinen Mentor Andre (justme1968), er hat mir mit hilfreichen Tips geholfen Perlcode zu verstehen und Spaß am programmieren zu haben.<br>
|
||||
Auch möchte ich mich bei Jens bedanken (jensb) welcher mir ebenfalls mit hilfreichen Tips bei meinen aller ersten Gehversuchen beim Perlcode schreiben unterstützt hat.<br>
|
||||
So und nun noch ein besonderer Dank an pah (Prof. Dr. Peter Henning ), ohne seine Aussage "Keine Ahnung hatten wir alle mal, das ist keine Ausrede" hätte ich bestimmt nicht angefangen Interesse an
|
||||
Modulentwicklung zu zeigen :-)</b>
|
||||
</ul>
|
||||
|
||||
=end html_DE
|
||||
=cut
|
902
fhem/FHEM/lib/74_AMADautomagicFlows0.6.0.xml
Normal file
902
fhem/FHEM/lib/74_AMADautomagicFlows0.6.0.xml
Normal file
@ -0,0 +1,902 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<data version="1.28.0">
|
||||
<trigger type="general_broadcast">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>com.android.music.metachanged</name>
|
||||
<enabled>true</enabled>
|
||||
<action>com.android.music.metachanged</action>
|
||||
<categoryList></categoryList>
|
||||
<dataSchemeList></dataSchemeList>
|
||||
<dataAuthorityList></dataAuthorityList>
|
||||
<dataPathLiteralList></dataPathLiteralList>
|
||||
<dataPathPrefixList></dataPathPrefixList>
|
||||
<dataPathGlobList></dataPathGlobList>
|
||||
<dataTypeList></dataTypeList>
|
||||
<extras>global_artist = getString("artist");
|
||||
global_track = getString("track");
|
||||
global_album = getString("album");</extras>
|
||||
<receiveInitialStickyBroadcast>false</receiveInitialStickyBroadcast>
|
||||
</trigger>
|
||||
<trigger type="http_request">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>HTTP Request: /fhem-amad/deviceInfo/</name>
|
||||
<enabled>true</enabled>
|
||||
<path>/fhem-amad/deviceInfo/</path>
|
||||
<port>8090</port>
|
||||
<acquireWifiLock>true</acquireWifiLock>
|
||||
</trigger>
|
||||
<trigger type="http_request">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>HTTP Request: /fhem-amad/setCommands/*</name>
|
||||
<enabled>true</enabled>
|
||||
<path>/fhem-amad/setCommands/*</path>
|
||||
<port>8090</port>
|
||||
<acquireWifiLock>true</acquireWifiLock>
|
||||
</trigger>
|
||||
<condition type="battery_level">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Akku Ladestand: grösser als 0%</name>
|
||||
<levelPercentage>0</levelPercentage>
|
||||
<batteryLevelCondition>HIGHER_THAN</batteryLevelCondition>
|
||||
</condition>
|
||||
<condition type="app_task_running">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>App Task läuft: App3 (neuster)</name>
|
||||
<packageNameList></packageNameList>
|
||||
<checkMostRecentAppTaskOnly>true</checkMostRecentAppTaskOnly>
|
||||
</condition>
|
||||
<condition type="app_task_running">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>App Task läuft: App4 (neuster)</name>
|
||||
<packageNameList></packageNameList>
|
||||
<checkMostRecentAppTaskOnly>true</checkMostRecentAppTaskOnly>
|
||||
</condition>
|
||||
<condition type="app_task_running">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>App Task läuft: App5 (neuster)</name>
|
||||
<packageNameList></packageNameList>
|
||||
<checkMostRecentAppTaskOnly>true</checkMostRecentAppTaskOnly>
|
||||
</condition>
|
||||
<condition type="app_task_running">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>App Task läuft: gplay (neuster)</name>
|
||||
<packageNameList>com.google.android.music</packageNameList>
|
||||
<checkMostRecentAppTaskOnly>true</checkMostRecentAppTaskOnly>
|
||||
</condition>
|
||||
<condition type="app_task_running">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>App Task läuft: tuneinradio (neuster)</name>
|
||||
<packageNameList>tunein.player</packageNameList>
|
||||
<checkMostRecentAppTaskOnly>true</checkMostRecentAppTaskOnly>
|
||||
</condition>
|
||||
<condition type="notification_status_bar_displayed">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Benachrichtigung in Statusbar angezeigt: Automagic</name>
|
||||
<packageNameFilter>ch.gridvision.ppam.androidautomagic</packageNameFilter>
|
||||
<textMatchField>TEXT</textMatchField>
|
||||
<textMatchType>CONTAINS_TEXT</textMatchType>
|
||||
<textFilter></textFilter>
|
||||
<ignoreRegular>false</ignoreRegular>
|
||||
<ignoreOngoing>false</ignoreOngoing>
|
||||
</condition>
|
||||
<condition type="bluetooth_enabled">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Bluetooth eingeschaltet</name>
|
||||
</condition>
|
||||
<condition type="bluetooth_device_connected">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Bluetooth Gerät verbunden: Beliebiges Geräte</name>
|
||||
<any>true</any>
|
||||
<deviceAddress></deviceAddress>
|
||||
<deviceName></deviceName>
|
||||
</condition>
|
||||
<condition type="auto_rotate_screen_enabled">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Display automatisch drehen eingeschaltet</name>
|
||||
</condition>
|
||||
<condition type="screen_on">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Display eingeschaltet</name>
|
||||
</condition>
|
||||
<condition type="screen_orientation">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Display Orientierung: Portrait</name>
|
||||
<portrait>true</portrait>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: App3</name>
|
||||
<expression>param_app == ""</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: App4</name>
|
||||
<expression>param_app == ""</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: App5</name>
|
||||
<expression>param_app == ""</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: global_fhemdevice == "null"</name>
|
||||
<expression>global_fhemdevice == "null"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: global_fhemip == "null"</name>
|
||||
<expression>global_fhemip == "null"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: gplay</name>
|
||||
<expression>param_app == "gplay"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: mediaPlayer"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/mediaPlayer"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: openApp"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/openApp"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: openURL"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/openURL"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_button == "back"</name>
|
||||
<expression>param_button == "back"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_button == "next"</name>
|
||||
<expression>param_button == "next"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_button == "play"</name>
|
||||
<expression>param_button == "play"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_button == "stop"</name>
|
||||
<expression>param_button == "stop"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_fullscreen == "off"</name>
|
||||
<expression>param_fullscreen == "off"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_fullscreen == "on"</name>
|
||||
<expression>param_fullscreen == "on"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_orientation == "auto"</name>
|
||||
<expression>param_orientation == "auto"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_orientation == "landscape"</name>
|
||||
<expression>param_orientation == "landscape"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_orientation == "portrait"</name>
|
||||
<expression>param_orientation == "portrait"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_screen=="off"</name>
|
||||
<expression>param_screen=="off"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: param_screen=="on"</name>
|
||||
<expression>param_screen=="on"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: Reboot</name>
|
||||
<expression>param_syscmd == "reboot"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: screenMsg"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/screenMsg"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: setAlarm"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/setAlarm"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: setBrightness"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/setBrightness"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: setScreenFullscreen"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/setScreenFullscreen"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: setScreenOnOff"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/setScreenOnOff"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: setScreenOrientation"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/setScreenOrientation"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: setVolume"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/setVolume"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: System Command"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/systemcommand"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: trigger == "com.android.music.metachanged"</name>
|
||||
<expression>trigger == "com.android.music.metachanged"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Expression: trigger == "HTTP Request: /fhem-amad/setCommands/*"</name>
|
||||
<expression>trigger == "HTTP Request: /fhem-amad/setCommands/*"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: ttsMsg"</name>
|
||||
<expression>request_path == "/fhem-amad/setCommands/ttsMsg"</expression>
|
||||
</condition>
|
||||
<condition type="expression">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Expression: tuneinradio</name>
|
||||
<expression>param_app == "tuneinradio"</expression>
|
||||
</condition>
|
||||
<condition type="flow_enabled">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Flow Aktiv: Informations</name>
|
||||
<flowName>Informations</flowName>
|
||||
</condition>
|
||||
<condition type="flow_enabled">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Flow Aktiv: SetCommands</name>
|
||||
<flowName>SetCommands</flowName>
|
||||
</condition>
|
||||
<condition type="music_active">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Musik Aktiv</name>
|
||||
</condition>
|
||||
<condition type="wifi_connected">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>WLAN Verbunden: Alle SSIDs</name>
|
||||
<all>true</all>
|
||||
<ssidList></ssidList>
|
||||
</condition>
|
||||
<action type="launch_app">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>App Starten: App3</name>
|
||||
<packageName></packageName>
|
||||
<className></className>
|
||||
</action>
|
||||
<action type="launch_app">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>App Starten: App4</name>
|
||||
<packageName></packageName>
|
||||
<className></className>
|
||||
</action>
|
||||
<action type="launch_app">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>App Starten: App5</name>
|
||||
<packageName></packageName>
|
||||
<className></className>
|
||||
</action>
|
||||
<action type="launch_app">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>App Starten: PlayMusic</name>
|
||||
<packageName>com.google.android.music</packageName>
|
||||
<className></className>
|
||||
</action>
|
||||
<action type="launch_app">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>App Starten: tuneinradio</name>
|
||||
<packageName>tunein.player</packageName>
|
||||
<className></className>
|
||||
</action>
|
||||
<action type="control_audio_player">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Audio Player steuern: Medienknopf Play (Google Play Musik)</name>
|
||||
<simulateMediaButton>true</simulateMediaButton>
|
||||
<broadcastAction>LAUNCH</broadcastAction>
|
||||
<mediaButton>KEYCODE_MEDIA_PLAY</mediaButton>
|
||||
<explicitComponent>true</explicitComponent>
|
||||
<packageName>com.google.android.music</packageName>
|
||||
<className>com.google.android.music.playback.MediaButtonIntentReceiver</className>
|
||||
<appName>Google Play Musik</appName>
|
||||
</action>
|
||||
<action type="control_audio_player">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Audio Player steuern: Medienknopf Stopp (Google Play Musik)</name>
|
||||
<simulateMediaButton>true</simulateMediaButton>
|
||||
<broadcastAction>LAUNCH</broadcastAction>
|
||||
<mediaButton>KEYCODE_MEDIA_STOP</mediaButton>
|
||||
<explicitComponent>true</explicitComponent>
|
||||
<packageName>com.google.android.music</packageName>
|
||||
<className>com.google.android.music.playback.MediaButtonIntentReceiver</className>
|
||||
<appName>Google Play Musik</appName>
|
||||
</action>
|
||||
<action type="control_audio_player">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Audio Player steuern: Medienknopf Weiter (Google Play Musik)</name>
|
||||
<simulateMediaButton>true</simulateMediaButton>
|
||||
<broadcastAction>LAUNCH</broadcastAction>
|
||||
<mediaButton>KEYCODE_MEDIA_NEXT</mediaButton>
|
||||
<explicitComponent>true</explicitComponent>
|
||||
<packageName>com.google.android.music</packageName>
|
||||
<className>com.google.android.music.playback.MediaButtonIntentReceiver</className>
|
||||
<appName>Google Play Musik</appName>
|
||||
</action>
|
||||
<action type="control_audio_player">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Audio Player steuern: Medienknopf Zurück (Google Play Musik)</name>
|
||||
<simulateMediaButton>true</simulateMediaButton>
|
||||
<broadcastAction>LAUNCH</broadcastAction>
|
||||
<mediaButton>KEYCODE_MEDIA_PREVIOUS</mediaButton>
|
||||
<explicitComponent>true</explicitComponent>
|
||||
<packageName>com.google.android.music</packageName>
|
||||
<className>com.google.android.music.playback.MediaButtonIntentReceiver</className>
|
||||
<appName>Google Play Musik</appName>
|
||||
</action>
|
||||
<action type="notification_screen">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Benachrichtigung auf Bildschirm: {param_message} (lange)</name>
|
||||
<showText>true</showText>
|
||||
<text>{param_message}</text>
|
||||
<widgetName></widgetName>
|
||||
<width>200</width>
|
||||
<height>250</height>
|
||||
<stretchToFillArea>false</stretchToFillArea>
|
||||
<opacity>1.0</opacity>
|
||||
<durationLong>true</durationLong>
|
||||
<customPosition>false</customPosition>
|
||||
<gravityType>TOP_LEFT</gravityType>
|
||||
<xOffset>0</xOffset>
|
||||
<yOffset>0</yOffset>
|
||||
</action>
|
||||
<action type="set_auto_rotate_screen_state">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Display automatisch drehen ein-/ausschalten: Aus</name>
|
||||
<enable>false</enable>
|
||||
</action>
|
||||
<action type="set_auto_rotate_screen_state">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Display automatisch drehen ein-/ausschalten: Ein</name>
|
||||
<enable>true</enable>
|
||||
</action>
|
||||
<action type="lock_device">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Gerät sperren</name>
|
||||
</action>
|
||||
<action type="http_request">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>HTTP Request: GET http://{global_fhemip}:8085/fhem?cmd=sleep%202%3Bset%20{global_fhemdevice}%20statusRequest speichern in response</name>
|
||||
<url>http://{global_fhemip}:8085/fhem?cmd=sleep%202%3Bset%20{global_fhemdevice}%20statusRequest</url>
|
||||
<verifyCertificates>true</verifyCertificates>
|
||||
<basicAuthentication>false</basicAuthentication>
|
||||
<username></username>
|
||||
<httpMethod>GET</httpMethod>
|
||||
<httpContentType>X_WWW_FORM_URLENCODED</httpContentType>
|
||||
<contentType>text/plain</contentType>
|
||||
<generalTextData></generalTextData>
|
||||
<formFieldList>Lastname=XYZ,Firstname=ABC</formFieldList>
|
||||
<timeout>60000</timeout>
|
||||
<setCustomHTTPHeaders>false</setCustomHTTPHeaders>
|
||||
<customHTTPHeaders></customHTTPHeaders>
|
||||
<storeInVariable>true</storeInVariable>
|
||||
<variable>response</variable>
|
||||
<path>/storage/emulated/0/Download/file.bin</path>
|
||||
</action>
|
||||
<action type="write_http_response_text">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>HTTP Response Information</name>
|
||||
<text>powerLevel@@{battery_percentage}@@@@powerPlugged@@{battery_plugged}@@@@volumeMusikBluetooth@@{volumeMusikBluetooth}@@@@volumeMusikSpeaker@@{volumeMusikSpeaker}@@@@screenBrightness@@{screenBrightness}@@@@nextAlarmTime@@{next_alarmtime}@@@@nextAlarmDay@@{next_alarmday}@@@@screen@@{screen_state}@@@@automagicState@@{notification_text}@@@@screenOrientation@@{screen_orientation}@@@@currentMusicTrack@@{global_track}@@@@currentMusicAlbum@@{global_album}@@@@currentMusicArtist@@{global_artist}@@@@bluetooth@@{bluetooth_state}@@@@connectedBTdevices@@{connected_devices_names}@@@@flow_SetCommands@@{setCommandFlow_state}</text>
|
||||
<replaceVariables>true</replaceVariables>
|
||||
<contentType>text/plain</contentType>
|
||||
</action>
|
||||
<action type="write_http_response_text">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>HTTP Response SetCommand</name>
|
||||
<text>flow_informations@@{informationFlow_state}@@@@</text>
|
||||
<replaceVariables>true</replaceVariables>
|
||||
<contentType>text/plain</contentType>
|
||||
</action>
|
||||
<action type="init_variable_next_alarm">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Initialisiere Variable Nächster Alarm: next_alarm</name>
|
||||
<variable>next_alarm</variable>
|
||||
</action>
|
||||
<action type="init_variable_system_setting">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Initialisiere Variable Systemeinstellung: screenBrightness</name>
|
||||
<settingCategory>SYSTEM</settingCategory>
|
||||
<settingName>screen_brightness</settingName>
|
||||
<variable>screenBrightness</variable>
|
||||
</action>
|
||||
<action type="init_variable_system_setting">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Initialisiere Variable Systemeinstellung: volumeMusikBluetooth</name>
|
||||
<settingCategory>SYSTEM</settingCategory>
|
||||
<settingName>volume_music_bt_a2dp</settingName>
|
||||
<variable>volumeMusikBluetooth</variable>
|
||||
</action>
|
||||
<action type="init_variable_system_setting">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Initialisiere Variable Systemeinstellung: volumeMusikSpeaker</name>
|
||||
<settingCategory>SYSTEM</settingCategory>
|
||||
<settingName>volume_music_speaker</settingName>
|
||||
<variable>volumeMusikSpeaker</variable>
|
||||
</action>
|
||||
<action type="restore_audio_stream_volume">
|
||||
<useDefaultName>false</useDefaultName>
|
||||
<name>Lautstärken setzen</name>
|
||||
<restoreVolumeAlarm>false</restoreVolumeAlarm>
|
||||
<variableVolumeAlarm>global_volume_alarm</variableVolumeAlarm>
|
||||
<restoreVolumeDTMF>false</restoreVolumeDTMF>
|
||||
<variableVolumeDTMF>global_volume_dtmf</variableVolumeDTMF>
|
||||
<restoreVolumeMusic>true</restoreVolumeMusic>
|
||||
<variableVolumeMusic>param_volume</variableVolumeMusic>
|
||||
<restoreVolumeNotification>false</restoreVolumeNotification>
|
||||
<variableVolumeNotification>global_volume_notification</variableVolumeNotification>
|
||||
<restoreVolumeRing>false</restoreVolumeRing>
|
||||
<variableVolumeRing>global_volume_ring</variableVolumeRing>
|
||||
<restoreVolumeSystem>false</restoreVolumeSystem>
|
||||
<variableVolumeSystem>global_volume_system</variableVolumeSystem>
|
||||
<restoreVolumeVoiceCall>false</restoreVolumeVoiceCall>
|
||||
<variableVolumeVoiceCall>global_volume_voice_call</variableVolumeVoiceCall>
|
||||
<restoreRingerMode>false</restoreRingerMode>
|
||||
<variableRingerMode>global_ringer_mode</variableRingerMode>
|
||||
<restoreInterruptionsMode>false</restoreInterruptionsMode>
|
||||
<variableInterruptionsMode>global_interruptions_mode</variableInterruptionsMode>
|
||||
</action>
|
||||
<action type="reboot">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Neustart </name>
|
||||
<options></options>
|
||||
</action>
|
||||
<action type="sleep">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Pause: 2s (Gerät wach halten)</name>
|
||||
<duration>2s</duration>
|
||||
<keepDeviceAwake>true</keepDeviceAwake>
|
||||
</action>
|
||||
<action type="turn_screen_on">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Schalte Display ein: Hell für 120s</name>
|
||||
<bright>true</bright>
|
||||
<duration>120s</duration>
|
||||
<resetUserActivityTimer>true</resetUserActivityTimer>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: bluetooth_state = "off"</name>
|
||||
<script>bluetooth_state = "off"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: bluetooth_state = "on"</name>
|
||||
<script>bluetooth_state = "on"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: global_artist = "no soundplayer activ"; global_track = "no soundplayer activ"; global_album = "no soundplayer activ";</name>
|
||||
<script>global_artist = "no soundplayer activ";
|
||||
global_track = "no soundplayer activ";
|
||||
global_album = "no soundplayer activ";</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: global_fhemip = {header_fhemip} global_fhemdevice = {header_fhemdevice}</name>
|
||||
<script>global_fhemip = {header_fhemip}
|
||||
global_fhemdevice = {header_fhemdevice}</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: informationFlow_state = "aktiv"</name>
|
||||
<script>informationFlow_state = "aktiv"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: informationFlow_state = "inaktiv"</name>
|
||||
<script>informationFlow_state = "inaktiv"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: next_alarmday = "{next_alarm,dateformat,c}"</name>
|
||||
<script>next_alarmday = "{next_alarm,dateformat,c}"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: next_alarmtime = "{next_alarm,dateformat,HH:mm}"</name>
|
||||
<script>next_alarmtime = "{next_alarm,dateformat,HH:mm}"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: notification_text = "no supported from your device"</name>
|
||||
<script>notification_text = "no supported from your device"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: screen_orientation = "auto"</name>
|
||||
<script>screen_orientation = "auto"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: screen_orientation = "landscape"</name>
|
||||
<script>screen_orientation = "landscape"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: screen_orientation = "portrait"</name>
|
||||
<script>screen_orientation = "portrait"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: screen_state = "off"</name>
|
||||
<script>screen_state = "off"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: screen_state = "on"</name>
|
||||
<script>screen_state = "on"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: setCommandFlow_state = "aktiv"</name>
|
||||
<script>setCommandFlow_state = "aktiv"</script>
|
||||
</action>
|
||||
<action type="script">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Script: setCommandFlow_state = "inaktiv"</name>
|
||||
<script>setCommandFlow_state = "inaktiv"</script>
|
||||
</action>
|
||||
<action type="set_alarm">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Setze Alarm: um {param_hour}:{param_minute}</name>
|
||||
<label></label>
|
||||
<hour>{param_hour}</hour>
|
||||
<minutes>{param_minute}</minutes>
|
||||
</action>
|
||||
<action type="set_screen_orientation">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Setze Display Orientierung: Auf Default zurücksetzen</name>
|
||||
<screenOrientation>UNSPECIFIED</screenOrientation>
|
||||
<showResetNotification>false</showResetNotification>
|
||||
</action>
|
||||
<action type="set_screen_orientation">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Setze Display Orientierung: Landscape</name>
|
||||
<screenOrientation>LANDSCAPE</screenOrientation>
|
||||
<showResetNotification>false</showResetNotification>
|
||||
</action>
|
||||
<action type="set_screen_orientation">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Setze Display Orientierung: Portrait</name>
|
||||
<screenOrientation>PORTRAIT</screenOrientation>
|
||||
<showResetNotification>false</showResetNotification>
|
||||
</action>
|
||||
<action type="set_flow_state">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Setze Flow Status: Aktivieren Informations</name>
|
||||
<enable>true</enable>
|
||||
<includeFlowNamePatternList>Informations</includeFlowNamePatternList>
|
||||
<excludeFlowNamePatternList></excludeFlowNamePatternList>
|
||||
</action>
|
||||
<action type="set_flow_state">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Setze Flow Status: Aktivieren SetCommands</name>
|
||||
<enable>true</enable>
|
||||
<includeFlowNamePatternList>SetCommands</includeFlowNamePatternList>
|
||||
<excludeFlowNamePatternList></excludeFlowNamePatternList>
|
||||
</action>
|
||||
<action type="set_system_setting">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Setze Systemeinstellung: System screen_brightness auf {param_brightness}</name>
|
||||
<settingCategory>SYSTEM</settingCategory>
|
||||
<settingName>screen_brightness</settingName>
|
||||
<value>{param_brightness}</value>
|
||||
<verified>true</verified>
|
||||
</action>
|
||||
<action type="set_immersive_mode">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Setze Vollbild Modus: Auf Default zurücksetzen</name>
|
||||
<immersiveMode>UNSPECIFIED</immersiveMode>
|
||||
<showResetNotification>false</showResetNotification>
|
||||
</action>
|
||||
<action type="set_immersive_mode">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Setze Vollbild Modus: Navigation nicht anzeigen</name>
|
||||
<immersiveMode>HIDE_NAVIGATION</immersiveMode>
|
||||
<showResetNotification>false</showResetNotification>
|
||||
</action>
|
||||
<action type="speech_output">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>Sprachausgabe: {param_message}</name>
|
||||
<audioStreamType>MUSIC</audioStreamType>
|
||||
<text>{param_message}</text>
|
||||
<locale>de_DE</locale>
|
||||
<usePitch>true</usePitch>
|
||||
<pitch>1.0</pitch>
|
||||
<useSpeechRate>true</useSpeechRate>
|
||||
<speechRate>1.0</speechRate>
|
||||
<embeddedSynthesis>true</embeddedSynthesis>
|
||||
<networkSynthesis>false</networkSynthesis>
|
||||
<showStopSpeechNotification>false</showStopSpeechNotification>
|
||||
<requestAudioFocus>false</requestAudioFocus>
|
||||
<audioFocusType>TRANSIENT</audioFocusType>
|
||||
</action>
|
||||
<action type="open_browser_url">
|
||||
<useDefaultName>true</useDefaultName>
|
||||
<name>URL in Browser öffnen: {param_url} (mit Chrome)</name>
|
||||
<url>{param_url}</url>
|
||||
<explicitComponent>true</explicitComponent>
|
||||
<packageName>com.android.chrome</packageName>
|
||||
<className>com.google.android.apps.chrome.Main</className>
|
||||
<appName>Chrome</appName>
|
||||
</action>
|
||||
<flow type="flow">
|
||||
<name>Informations</name>
|
||||
<group>FHEM Info / Steuerung über AMAD Modul v0.6</group>
|
||||
<enabled>true</enabled>
|
||||
<executionPolicy>SKIP</executionPolicy>
|
||||
<emergencyStopCount>120</emergencyStopCount>
|
||||
<triggercontainer id="t1" x="1015.0" y="-1172.5">
|
||||
<trigger>com.android.music.metachanged</trigger>
|
||||
<trigger>HTTP Request: /fhem-amad/deviceInfo/</trigger>
|
||||
</triggercontainer>
|
||||
<actioncontainer id="t2" x="1505.0" y="857.5">Script: notification_text = "no supported from your device"</actioncontainer>
|
||||
<actioncontainer id="t3" x="1715.0" y="857.5">Script: screen_orientation = "auto"</actioncontainer>
|
||||
<conditioncontainer id="t4" x="1715.0" y="612.5">Display automatisch drehen eingeschaltet</conditioncontainer>
|
||||
<actioncontainer id="t5" x="1925.0" y="857.5">Script: screen_orientation = "portrait"</actioncontainer>
|
||||
<conditioncontainer id="t6" x="2030.0" y="682.5">Display Orientierung: Portrait</conditioncontainer>
|
||||
<actioncontainer id="t7" x="2135.0" y="857.5">Script: screen_orientation = "landscape"</actioncontainer>
|
||||
<conditioncontainer id="t8" x="2450.0" y="612.5">Bluetooth eingeschaltet</conditioncontainer>
|
||||
<actioncontainer id="t9" x="2345.0" y="857.5">Script: bluetooth_state = "on"</actioncontainer>
|
||||
<conditioncontainer id="t10" x="2485.0" y="857.5">Bluetooth Gerät verbunden: Beliebiges Geräte</conditioncontainer>
|
||||
<actioncontainer id="t11" x="2625.0" y="857.5">Script: bluetooth_state = "off"</actioncontainer>
|
||||
<actioncontainer id="t12" x="1295.0" y="857.5">Script: screen_state = "off"</actioncontainer>
|
||||
<actioncontainer id="t13" x="1085.0" y="857.5">Script: screen_state = "on"</actioncontainer>
|
||||
<conditioncontainer id="t14" x="1190.0" y="612.5">Display eingeschaltet</conditioncontainer>
|
||||
<actioncontainer id="t15" x="665.0" y="857.5">Script: next_alarmtime = "{next_alarm,dateformat,HH:mm}"</actioncontainer>
|
||||
<actioncontainer id="t16" x="770.0" y="612.5">Initialisiere Variable Nächster Alarm: next_alarm</actioncontainer>
|
||||
<actioncontainer id="t17" x="875.0" y="857.5">Script: next_alarmday = "{next_alarm,dateformat,c}"</actioncontainer>
|
||||
<actioncontainer id="t18" x="490.0" y="612.5">Initialisiere Variable Systemeinstellung: screenBrightness</actioncontainer>
|
||||
<actioncontainer id="t19" x="280.0" y="612.5">Initialisiere Variable Systemeinstellung: volumeMusikSpeaker</actioncontainer>
|
||||
<actioncontainer id="t20" x="70.0" y="612.5">Initialisiere Variable Systemeinstellung: volumeMusikBluetooth</actioncontainer>
|
||||
<conditioncontainer id="t21" x="665.0" y="-332.5">Expression: global_fhemip == "null"</conditioncontainer>
|
||||
<conditioncontainer id="t22" x="805.0" y="-332.5">Expression: global_fhemdevice == "null"</conditioncontainer>
|
||||
<actioncontainer id="t23" x="735.0" y="-87.5">Script: global_fhemip = {header_fhemip} global_fhemdevice = {header_fhemdevice}</actioncontainer>
|
||||
<conditioncontainer id="t24" x="-455.0" y="612.5">Flow Aktiv: SetCommands</conditioncontainer>
|
||||
<actioncontainer id="t25" x="-350.0" y="857.5">Script: setCommandFlow_state = "aktiv"</actioncontainer>
|
||||
<actioncontainer id="t26" x="-560.0" y="857.5">Script: setCommandFlow_state = "inaktiv"</actioncontainer>
|
||||
<actioncontainer id="t27" x="-665.0" y="1032.5">Setze Flow Status: Aktivieren SetCommands</actioncontainer>
|
||||
<conditioncontainer id="t28" x="1435.0" y="612.5">Benachrichtigung in Statusbar angezeigt: Automagic</conditioncontainer>
|
||||
<actioncontainer id="t29" x="1015.0" y="1487.5">HTTP Response Information</actioncontainer>
|
||||
<conditioncontainer id="t30" x="1015.0" y="-87.5">Akku Ladestand: grösser als 0%</conditioncontainer>
|
||||
<actioncontainer id="t31" x="-140.0" y="857.5">Script: global_artist = "no soundplayer activ"; global_track = "no soundplayer activ"; global_album = "no soundplayer activ";</actioncontainer>
|
||||
<conditioncontainer id="t32" x="-140.0" y="612.5">Musik Aktiv</conditioncontainer>
|
||||
<actioncontainer id="t33" x="1015.0" y="-332.5">Pause: 2s (Gerät wach halten)</actioncontainer>
|
||||
<conditioncontainer id="t34" x="1015.0" y="-822.5">Expression: trigger == "com.android.music.metachanged"</conditioncontainer>
|
||||
<conditioncontainer id="t35" x="2065.0" y="-332.5">WLAN Verbunden: Alle SSIDs</conditioncontainer>
|
||||
<actioncontainer id="t36" x="2065.0" y="-87.5">HTTP Request: GET http://{global_fhemip}:8085/fhem?cmd=sleep%202%3Bset%20{global_fhemdevice}%20statusRequest speichern in response</actioncontainer>
|
||||
<connection from="t1" to="t34" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t2" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t3" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t4" to="t6" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t4" to="t3" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t5" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t6" to="t5" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t6" to="t7" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t7" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t8" to="t9" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t8" to="t11" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t8" to="t10" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t10" to="t29" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t11" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t12" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t13" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t14" to="t13" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t14" to="t12" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t15" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t16" to="t15" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t16" to="t17" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t17" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t18" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t19" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t20" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t21" to="t23" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t22" to="t23" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t24" to="t25" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t24" to="t26" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t25" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t26" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t26" to="t27" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t28" to="t2" type="EXCEPTION" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t28" to="t29" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t20" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t19" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t18" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t16" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t14" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t28" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t4" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t32" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t8" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t24" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t31" to="t29" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t32" to="t31" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t33" to="t30" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t34" to="t33" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t34" to="t21" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t34" to="t22" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t34" to="t35" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t35" to="t36" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
</flow>
|
||||
<flow type="flow">
|
||||
<name>SetCommands</name>
|
||||
<group>FHEM Info / Steuerung über AMAD Modul v0.6</group>
|
||||
<enabled>true</enabled>
|
||||
<executionPolicy>QUEUE</executionPolicy>
|
||||
<emergencyStopCount>120</emergencyStopCount>
|
||||
<triggercontainer id="t1" x="-805.0" y="-2327.5">
|
||||
<trigger>HTTP Request: /fhem-amad/deviceInfo/</trigger>
|
||||
<trigger>HTTP Request: /fhem-amad/setCommands/*</trigger>
|
||||
</triggercontainer>
|
||||
<conditioncontainer id="t2" x="-1435.0" y="367.5">Expression: param_screen=="on"</conditioncontainer>
|
||||
<actioncontainer id="t3" x="-1225.0" y="892.5">Sprachausgabe: {param_message}</actioncontainer>
|
||||
<conditioncontainer id="t4" x="-1225.0" y="-122.5">Expression: ttsMsg"</conditioncontainer>
|
||||
<conditioncontainer id="t5" x="-1015.0" y="-122.5">Expression: setBrightness"</conditioncontainer>
|
||||
<conditioncontainer id="t6" x="-805.0" y="-122.5">Expression: setAlarm"</conditioncontainer>
|
||||
<conditioncontainer id="t7" x="-595.0" y="-122.5">Expression: screenMsg"</conditioncontainer>
|
||||
<conditioncontainer id="t8" x="-385.0" y="-122.5">Expression: openURL"</conditioncontainer>
|
||||
<actioncontainer id="t9" x="-805.0" y="892.5">Setze Alarm: um {param_hour}:{param_minute}</actioncontainer>
|
||||
<actioncontainer id="t10" x="-385.0" y="892.5">URL in Browser öffnen: {param_url} (mit Chrome)</actioncontainer>
|
||||
<actioncontainer id="t11" x="-595.0" y="892.5">Benachrichtigung auf Bildschirm: {param_message} (lange)</actioncontainer>
|
||||
<actioncontainer id="t12" x="-1435.0" y="892.5">Schalte Display ein: Hell für 120s</actioncontainer>
|
||||
<conditioncontainer id="t13" x="770.0" y="-122.5">Expression: setScreenFullscreen"</conditioncontainer>
|
||||
<conditioncontainer id="t14" x="1505.0" y="577.5">Expression: param_orientation == "auto"</conditioncontainer>
|
||||
<actioncontainer id="t15" x="1295.0" y="892.5">Setze Display Orientierung: Portrait</actioncontainer>
|
||||
<actioncontainer id="t16" x="1085.0" y="892.5">Setze Display Orientierung: Landscape</actioncontainer>
|
||||
<conditioncontainer id="t17" x="1085.0" y="577.5">Expression: param_orientation == "landscape"</conditioncontainer>
|
||||
<conditioncontainer id="t18" x="1295.0" y="577.5">Expression: param_orientation == "portrait"</conditioncontainer>
|
||||
<conditioncontainer id="t19" x="875.0" y="577.5">Expression: param_fullscreen == "off"</conditioncontainer>
|
||||
<actioncontainer id="t20" x="665.0" y="892.5">Setze Vollbild Modus: Navigation nicht anzeigen</actioncontainer>
|
||||
<conditioncontainer id="t21" x="665.0" y="577.5">Expression: param_fullscreen == "on"</conditioncontainer>
|
||||
<actioncontainer id="t22" x="875.0" y="892.5">Setze Vollbild Modus: Auf Default zurücksetzen</actioncontainer>
|
||||
<actioncontainer id="t23" x="455.0" y="892.5">Audio Player steuern: Medienknopf Zurück (Google Play Musik)</actioncontainer>
|
||||
<conditioncontainer id="t24" x="455.0" y="577.5">Expression: param_button == "back"</conditioncontainer>
|
||||
<actioncontainer id="t25" x="1190.0" y="1032.5">Display automatisch drehen ein-/ausschalten: Aus</actioncontainer>
|
||||
<conditioncontainer id="t26" x="245.0" y="577.5">Expression: param_button == "next"</conditioncontainer>
|
||||
<actioncontainer id="t27" x="1505.0" y="892.5">Setze Display Orientierung: Auf Default zurücksetzen</actioncontainer>
|
||||
<actioncontainer id="t28" x="1505.0" y="1032.5">Display automatisch drehen ein-/ausschalten: Ein</actioncontainer>
|
||||
<actioncontainer id="t29" x="35.0" y="892.5">Audio Player steuern: Medienknopf Play (Google Play Musik)</actioncontainer>
|
||||
<conditioncontainer id="t30" x="35.0" y="577.5">Expression: param_button == "play"</conditioncontainer>
|
||||
<conditioncontainer id="t31" x="140.0" y="-122.5">Expression: mediaPlayer"</conditioncontainer>
|
||||
<actioncontainer id="t32" x="245.0" y="892.5">Audio Player steuern: Medienknopf Weiter (Google Play Musik)</actioncontainer>
|
||||
<actioncontainer id="t33" x="-175.0" y="892.5">Audio Player steuern: Medienknopf Stopp (Google Play Musik)</actioncontainer>
|
||||
<conditioncontainer id="t34" x="-175.0" y="577.5">Expression: param_button == "stop"</conditioncontainer>
|
||||
<conditioncontainer id="t35" x="-1645.0" y="367.5">Expression: param_screen=="off"</conditioncontainer>
|
||||
<actioncontainer id="t36" x="-1645.0" y="892.5">Gerät sperren</actioncontainer>
|
||||
<conditioncontainer id="t37" x="-1540.0" y="-122.5">Expression: setScreenOnOff"</conditioncontainer>
|
||||
<conditioncontainer id="t38" x="-1855.0" y="-122.5">Expression: setVolume"</conditioncontainer>
|
||||
<actioncontainer id="t39" x="-1855.0" y="892.5">Lautstärken setzen</actioncontainer>
|
||||
<conditioncontainer id="t40" x="-2065.0" y="577.5">App Task läuft: App5 (neuster)</conditioncontainer>
|
||||
<conditioncontainer id="t41" x="-2065.0" y="367.5">Expression: App5</conditioncontainer>
|
||||
<conditioncontainer id="t42" x="-2275.0" y="367.5">Expression: App4</conditioncontainer>
|
||||
<conditioncontainer id="t43" x="-2485.0" y="577.5">App Task läuft: App3 (neuster)</conditioncontainer>
|
||||
<conditioncontainer id="t44" x="-2485.0" y="367.5">Expression: App3</conditioncontainer>
|
||||
<actioncontainer id="t45" x="-2485.0" y="892.5">App Starten: App3</actioncontainer>
|
||||
<actioncontainer id="t46" x="-2275.0" y="892.5">App Starten: App4</actioncontainer>
|
||||
<conditioncontainer id="t47" x="-2275.0" y="577.5">App Task läuft: App4 (neuster)</conditioncontainer>
|
||||
<conditioncontainer id="t48" x="-2695.0" y="367.5">Expression: tuneinradio</conditioncontainer>
|
||||
<conditioncontainer id="t49" x="-2695.0" y="577.5">App Task läuft: tuneinradio (neuster)</conditioncontainer>
|
||||
<actioncontainer id="t50" x="-2695.0" y="892.5">App Starten: tuneinradio</actioncontainer>
|
||||
<actioncontainer id="t51" x="-2065.0" y="892.5">App Starten: App5</actioncontainer>
|
||||
<conditioncontainer id="t52" x="-2905.0" y="577.5">App Task läuft: gplay (neuster)</conditioncontainer>
|
||||
<conditioncontainer id="t53" x="-2905.0" y="367.5">Expression: gplay</conditioncontainer>
|
||||
<actioncontainer id="t54" x="-2905.0" y="892.5">App Starten: PlayMusic</actioncontainer>
|
||||
<conditioncontainer id="t55" x="-2485.0" y="-122.5">Expression: openApp"</conditioncontainer>
|
||||
<conditioncontainer id="t56" x="-3115.0" y="-122.5">Expression: System Command"</conditioncontainer>
|
||||
<conditioncontainer id="t57" x="1295.0" y="-122.5">Expression: setScreenOrientation"</conditioncontainer>
|
||||
<conditioncontainer id="t58" x="-3115.0" y="367.5">Expression: Reboot</conditioncontainer>
|
||||
<actioncontainer id="t59" x="-3115.0" y="892.5">Neustart </actioncontainer>
|
||||
<actioncontainer id="t60" x="-1015.0" y="892.5">Setze Systemeinstellung: System screen_brightness auf {param_brightness}</actioncontainer>
|
||||
<conditioncontainer id="t61" x="-805.0" y="-2012.5">Expression: trigger == "HTTP Request: /fhem-amad/setCommands/*"</conditioncontainer>
|
||||
<actioncontainer id="t62" x="-1470.0" y="-1557.5">Setze Flow Status: Aktivieren Informations</actioncontainer>
|
||||
<actioncontainer id="t63" x="-1330.0" y="-1802.5">Script: informationFlow_state = "inaktiv"</actioncontainer>
|
||||
<actioncontainer id="t64" x="-1120.0" y="-1802.5">Script: informationFlow_state = "aktiv"</actioncontainer>
|
||||
<conditioncontainer id="t65" x="-1225.0" y="-2012.5">Flow Aktiv: Informations</conditioncontainer>
|
||||
<actioncontainer id="t66" x="-1225.0" y="-1417.5">HTTP Response SetCommand</actioncontainer>
|
||||
<connection from="t1" to="t61" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t2" to="t12" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t4" to="t3" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t5" to="t60" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t6" to="t9" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t7" to="t11" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t8" to="t10" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t13" to="t21" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t13" to="t19" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t14" to="t27" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t15" to="t25" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t16" to="t25" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t17" to="t16" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t18" to="t15" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t19" to="t22" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t21" to="t20" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t24" to="t23" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t26" to="t32" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t27" to="t28" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t30" to="t29" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t31" to="t34" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t31" to="t30" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t31" to="t26" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t31" to="t24" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t34" to="t33" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t35" to="t36" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t37" to="t35" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t37" to="t2" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t38" to="t39" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t40" to="t51" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t41" to="t40" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t42" to="t47" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t43" to="t45" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t44" to="t43" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t47" to="t46" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t48" to="t49" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t49" to="t50" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t52" to="t54" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t53" to="t52" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t55" to="t44" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t55" to="t53" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t55" to="t48" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t55" to="t42" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t55" to="t41" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t56" to="t58" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t57" to="t18" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t57" to="t17" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t57" to="t14" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t58" to="t59" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t56" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t55" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t38" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t37" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t4" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t5" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t6" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t7" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t8" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t31" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t13" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t57" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t61" to="t65" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t63" to="t62" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t63" to="t66" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t64" to="t66" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t65" to="t63" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
<connection from="t65" to="t64" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
|
||||
</flow>
|
||||
</data>
|
Loading…
x
Reference in New Issue
Block a user