Änderungen innerhalb der Fehlerbehandlung, neues setCommand Vibrate

This commit is contained in:
Marko Oldenburg 2016-01-26 09:51:29 +01:00
parent 7697ad1593
commit 763074b225
2 changed files with 261 additions and 75 deletions

View File

@ -2,7 +2,7 @@
#
# Developed with Kate
#
# (c) 2015 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
# (c) 2015-2016 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
# All rights reserved
#
# This script is free software; you can redistribute it and/or modify
@ -37,7 +37,7 @@ use TcpServerUtils;
use Encode qw(encode);
my $version = "1.1.20";
my $version = "1.1.23";
@ -465,6 +465,7 @@ sub AMAD_Set($$@) {
$list .= "activateVoiceInput:noArg ";
$list .= "screenLock:on,off " if( AttrVal( $name, "setScreenlockPIN", "none" ) ne "none" );
$list .= "volumeNotification:slider,0,1,7 ";
$list .= "vibrate:noArg";
if( lc $cmd eq 'screenmsg'
|| lc $cmd eq 'ttsmsg'
@ -486,7 +487,8 @@ sub AMAD_Set($$@) {
|| lc $cmd eq 'activatevoiceinput'
|| lc $cmd eq 'volumenotification'
|| lc $cmd eq 'screenlock'
|| lc $cmd eq 'statusrequest' ) {
|| lc $cmd eq 'statusrequest'
|| lc $cmd eq 'vibrate') {
Log3 $name, 5, "AMAD ($name) - set $name $cmd ".join(" ", @val);
@ -496,7 +498,7 @@ sub AMAD_Set($$@) {
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' ) || ( lc $cmd eq 'activatevoiceinput' );
return AMAD_SelectSetCmd( $hash, $cmd, @val ) if( @val ) || ( lc $cmd eq 'statusrequest' ) || ( lc $cmd eq 'activatevoiceinput' ) || ( lc $cmd eq 'vibrate' );
}
return "Unknown argument $cmd, bearword as argument or wrong parameter(s), choose one of $list";
@ -614,7 +616,6 @@ sub AMAD_SelectSetCmd($$@) {
}
elsif( lc $cmd eq 'activatevoiceinput' ) {
#my $cmd = join( " ", @data );
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/setvoicecmd";
@ -719,6 +720,13 @@ sub AMAD_SelectSetCmd($$@) {
readingsSingleUpdate( $hash, $cmd, $lockmod, 1 );
return AMAD_HTTP_POST( $hash,$url );
}
elsif( lc $cmd eq 'vibrate' ) {
my $url = "http://" . $host . ":" . $port . "/fhem-amad/setCommands/setvibrate";
return AMAD_HTTP_POST( $hash,$url );
}
return undef;
}

View File

@ -17,12 +17,30 @@ global_track = getString("track");
global_album = getString("album");</extras>
<receiveInitialStickyBroadcast>false</receiveInitialStickyBroadcast>
</trigger>
<trigger type="display_state">
<useDefaultName>true</useDefaultName>
<name>Display Status: Aus</name>
<enabled>false</enabled>
<displayOn>false</displayOn>
</trigger>
<trigger type="display_state">
<useDefaultName>true</useDefaultName>
<name>Display Status: Ein</name>
<enabled>false</enabled>
<displayOn>true</displayOn>
</trigger>
<trigger type="global_variable">
<useDefaultName>true</useDefaultName>
<name>Globale Variable: global_own_reading</name>
<enabled>true</enabled>
<variable>global_own_reading</variable>
</trigger>
<trigger type="global_variable">
<useDefaultName>true</useDefaultName>
<name>Globale Variable: global_touched</name>
<enabled>false</enabled>
<variable>global_touched</variable>
</trigger>
<trigger type="http_request">
<useDefaultName>false</useDefaultName>
<name>HTTP Request: /fhem-amad/deviceInfo/</name>
@ -39,6 +57,27 @@ global_album = getString("album");</extras>
<port>8090</port>
<acquireWifiLock>true</acquireWifiLock>
</trigger>
<trigger type="periodic_timer">
<useDefaultName>true</useDefaultName>
<name>Periodischer Timer: alle 4m</name>
<enabled>false</enabled>
<frequency>240000</frequency>
<wakeDevice>true</wakeDevice>
<fixedTimes>false</fixedTimes>
<limitTimeRange>false</limitTimeRange>
<weekday>Mon</weekday>
<weekday>Tue</weekday>
<weekday>Wed</weekday>
<weekday>Thu</weekday>
<weekday>Fri</weekday>
<weekday>Sat</weekday>
<weekday>Sun</weekday>
<hourFrom>8</hourFrom>
<minuteFrom>0</minuteFrom>
<hourTo>17</hourTo>
<minuteTo>0</minuteTo>
<allowInDeviceIdle>false</allowInDeviceIdle>
</trigger>
<trigger type="voice_command_requested">
<useDefaultName>true</useDefaultName>
<name>Sprachbefehl angefordert</name>
@ -157,6 +196,16 @@ global_album = getString("album");</extras>
<name>Expression: getAndroidSDKVersion() &gt;= "19"</name>
<expression>getAndroidSDKVersion() &gt;= "19"</expression>
</condition>
<condition type="expression">
<useDefaultName>true</useDefaultName>
<name>Expression: global_touched=="ja"</name>
<expression>global_touched=="ja"</expression>
</condition>
<condition type="expression">
<useDefaultName>true</useDefaultName>
<name>Expression: global_touched=="wait"</name>
<expression>global_touched=="wait"</expression>
</condition>
<condition type="expression">
<useDefaultName>false</useDefaultName>
<name>Expression: gplay</name>
@ -317,6 +366,11 @@ global_album = getString("album");</extras>
<name>Expression: setScreenOrientation"</name>
<expression>request_path == "/fhem-amad/setCommands/setScreenOrientation"</expression>
</condition>
<condition type="expression">
<useDefaultName>false</useDefaultName>
<name>Expression: setVibrate"</name>
<expression>request_path == "/fhem-amad/setCommands/setvibrate"</expression>
</condition>
<condition type="expression">
<useDefaultName>false</useDefaultName>
<name>Expression: setVoiceCommand"</name>
@ -757,6 +811,16 @@ androidVersion = "4.0 - 4.0.2 Ice Cream Sandwich"
<settingName>volume_ring_speaker</settingName>
<variable>volumeNotification</variable>
</action>
<action type="execute_root_command">
<useDefaultName>true</useDefaultName>
<name>Kommandozeilenbefehl als Root ausführen: getevent -c 1 in </name>
<command>getevent -c 1</command>
<seContext></seContext>
<workingDirectory></workingDirectory>
<variableStdout>stdout</variableStdout>
<variableStderr>stderr</variableStderr>
<variableExitCode>exit_code</variableExitCode>
</action>
<action type="restore_audio_stream_volume">
<useDefaultName>false</useDefaultName>
<name>Lautstärken setzen param_notifivolume</name>
@ -879,6 +943,20 @@ FHEMCMD: setreading</customHTTPHeaders>
<path>/storage/emulated/0/Download/file.bin</path>
<followRedirects>true</followRedirects>
</action>
<action type="sleep">
<useDefaultName>true</useDefaultName>
<name>Pause: 10s (Schlafmodus zulassen)</name>
<duration>10s</duration>
<keepDeviceAwake>false</keepDeviceAwake>
<allowWakeupFromDeviceIdle>false</allowWakeupFromDeviceIdle>
</action>
<action type="sleep">
<useDefaultName>true</useDefaultName>
<name>Pause: 15s (Gerät wach halten)</name>
<duration>15s</duration>
<keepDeviceAwake>true</keepDeviceAwake>
<allowWakeupFromDeviceIdle>false</allowWakeupFromDeviceIdle>
</action>
<action type="sleep">
<useDefaultName>true</useDefaultName>
<name>Pause: 2s (Gerät wach halten)</name>
@ -943,12 +1021,42 @@ FHEMCMD: setreading</customHTTPHeaders>
global_track = "no soundplayer activ";
global_album = "no soundplayer activ";</script>
</action>
<action type="script">
<useDefaultName>true</useDefaultName>
<name>Script: global_display="an";global_own_reading="{getDate()}_display"</name>
<script>global_display="an";global_own_reading="{getDate()}_display"</script>
</action>
<action type="script">
<useDefaultName>true</useDefaultName>
<name>Script: global_display="aus";global_own_reading="{getDate()}_display"</name>
<script>global_display="aus";global_own_reading="{getDate()}_display"</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: global_touch="ja";global_own_reading="{getDate()}_touch";global_touched="ja"</name>
<script>global_touch="ja";global_own_reading="{getDate()}_touch";global_touched="ja"</script>
</action>
<action type="script">
<useDefaultName>true</useDefaultName>
<name>Script: global_touch="nein";global_own_reading="{getDate()}_touch"</name>
<script>global_touch="nein";global_own_reading="{getDate()}_touch"</script>
</action>
<action type="script">
<useDefaultName>true</useDefaultName>
<name>Script: global_touched="ja"</name>
<script>global_touched="ja"</script>
</action>
<action type="script">
<useDefaultName>true</useDefaultName>
<name>Script: global_touched="wait"</name>
<script>global_touched="wait"</script>
</action>
<action type="script">
<useDefaultName>true</useDefaultName>
<name>Script: informationFlow_state = "aktiv"</name>
@ -1204,6 +1312,13 @@ FHEMCMD: statusrequest</customHTTPHeaders>
<className>com.google.android.apps.chrome.Main</className>
<appName>Chrome</appName>
</action>
<action type="vibrate">
<useDefaultName>true</useDefaultName>
<name>Vibrieren: Pattern 2 (-- --)</name>
<custom>false</custom>
<vibratePattern>vibrate_pattern_2</vibratePattern>
<customPattern></customPattern>
</action>
<flow type="flow">
<name>Informations</name>
<group>FHEM Info / Steuerung über AMAD Modul v1.1.x</group>
@ -1352,6 +1467,65 @@ FHEMCMD: statusrequest</customHTTPHeaders>
<connection from="t48" to="t49" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t50" to="t49" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
</flow>
<flow type="flow">
<name>Meldung Display An</name>
<group>AMAD FHEM / OwnReadings Examples</group>
<enabled>false</enabled>
<executionPolicy>PARALLEL</executionPolicy>
<triggercontainer id="t1" x="70.0" y="52.5">
<trigger>Display Status: Ein</trigger>
</triggercontainer>
<actioncontainer id="t2" x="70.0" y="262.5">Script: global_display="an";global_own_reading="{getDate()}_display"</actioncontainer>
<connection from="t1" to="t2" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
</flow>
<flow type="flow">
<name>Meldung Display Aus</name>
<group>AMAD FHEM / OwnReadings Examples</group>
<enabled>false</enabled>
<executionPolicy>PARALLEL</executionPolicy>
<triggercontainer id="t1" x="70.0" y="52.5">
<trigger>Display Status: Aus</trigger>
</triggercontainer>
<actioncontainer id="t2" x="70.0" y="262.5">Script: global_display="aus";global_own_reading="{getDate()}_display"</actioncontainer>
<connection from="t1" to="t2" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
</flow>
<flow type="flow">
<name>Meldung kein Touch</name>
<group>AMAD FHEM / OwnReadings Examples</group>
<enabled>false</enabled>
<executionPolicy>STOP</executionPolicy>
<triggercontainer id="t1" x="245.0" y="52.5">
<trigger>Globale Variable: global_touched</trigger>
</triggercontainer>
<actioncontainer id="t2" x="245.0" y="297.5">Pause: 15s (Gerät wach halten)</actioncontainer>
<actioncontainer id="t3" x="525.0" y="682.5">Script: global_touched="wait"</actioncontainer>
<conditioncontainer id="t4" x="245.0" y="472.5">Expression: global_touched=="ja"</conditioncontainer>
<conditioncontainer id="t5" x="-105.0" y="682.5">Expression: global_touched=="wait"</conditioncontainer>
<actioncontainer id="t6" x="-105.0" y="927.5">Script: global_touch="nein";global_own_reading="{getDate()}_touch"</actioncontainer>
<connection from="t1" to="t2" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t2" to="t4" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t4" to="t3" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t4" to="t5" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t5" to="t6" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
</flow>
<flow type="flow">
<name>Meldung Touch</name>
<group>AMAD FHEM / OwnReadings Examples</group>
<enabled>false</enabled>
<executionPolicy>STOP</executionPolicy>
<triggercontainer id="t1" x="245.0" y="-87.5">
<trigger>Periodischer Timer: alle 4m</trigger>
</triggercontainer>
<actioncontainer id="t2" x="245.0" y="122.5">Kommandozeilenbefehl als Root ausführen: getevent -c 1 in </actioncontainer>
<actioncontainer id="t3" x="245.0" y="297.5">Script: global_touched="ja"</actioncontainer>
<actioncontainer id="t4" x="245.0" y="647.5">Pause: 10s (Schlafmodus zulassen)</actioncontainer>
<actioncontainer id="t5" x="245.0" y="472.5">Script: global_touch="ja";global_own_reading="{getDate()}_touch";global_touched="ja"</actioncontainer>
<connection from="t1" to="t2" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t2" to="t3" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t3" to="t5" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t4" to="t2" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t5" to="t4" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
</flow>
<flow type="flow">
<name>SetCommands</name>
<group>FHEM Info / Steuerung über AMAD Modul v1.1.x</group>
@ -1443,34 +1617,36 @@ FHEMCMD: statusrequest</customHTTPHeaders>
<conditioncontainer id="t79" x="-1855.0" y="-122.5">Expression: setVolume"</conditioncontainer>
<actioncontainer id="t80" x="-1855.0" y="892.5">Lautstärken setzen param_volume</actioncontainer>
<conditioncontainer id="t81" x="-630.0" y="-2257.5">Expression: trigger == "Sprachbefehl angefordert"</conditioncontainer>
<conditioncontainer id="t82" x="2555.0" y="-122.5">Expression: setVoiceCommand"</conditioncontainer>
<actioncontainer id="t83" x="2555.0" y="892.5">Flows ausführen: VoiceControl</actioncontainer>
<conditioncontainer id="t84" x="1295.0" y="577.5">Expression: param_orientation == "portrait"</conditioncontainer>
<actioncontainer id="t85" x="2975.0" y="892.5">Setze Lock PIN/Passwort: PIN/Passwort zurücksetzen</actioncontainer>
<conditioncontainer id="t86" x="2870.0" y="577.5">Expression: param_lockmod == "on"</conditioncontainer>
<conditioncontainer id="t87" x="2870.0" y="-122.5">Expression: setScreenlock"</conditioncontainer>
<conditioncontainer id="t88" x="-805.0" y="-2047.5">Expression: trigger == "HTTP Request: /fhem-amad/setCommands/*"</conditioncontainer>
<actioncontainer id="t89" x="2765.0" y="892.5">Setze Lock PIN/Passwort: Setze PIN von Variable param_lockpin</actioncontainer>
<conditioncontainer id="t90" x="-3115.0" y="367.5">Expression: Reboot</conditioncontainer>
<conditioncontainer id="t91" x="-3325.0" y="-122.500015">Expression: System Command"</conditioncontainer>
<actioncontainer id="t92" x="-3115.0" y="892.5">Neustart </actioncontainer>
<conditioncontainer id="t93" x="-3325.0" y="367.5">Expression: Shutdown</conditioncontainer>
<conditioncontainer id="t94" x="-3535.0" y="367.5">Expression: Airplanemode</conditioncontainer>
<actioncontainer id="t95" x="-3325.0" y="892.5">Herunterfahren</actioncontainer>
<actioncontainer id="t96" x="-3535.0" y="892.5">Flugmodus ein-/ausschalten: Ein</actioncontainer>
<actioncontainer id="t97" x="-3745.0" y="892.5">Sound: /storage/emulated/0/Notifications/{param_notifyfile} als Benachrichtigung</actioncontainer>
<actioncontainer id="t98" x="-3955.0005" y="892.5">Benachrichtigung aus Statusbar entfernen: Alle</actioncontainer>
<actioncontainer id="t99" x="-4165.0" y="892.5">Benachrichtigung aus Statusbar entfernen: Alle (Automagic)</actioncontainer>
<conditioncontainer id="t100" x="-4165.0" y="367.5">Expression: Automagic</conditioncontainer>
<conditioncontainer id="t101" x="-3955.0005" y="367.5">Expression: All</conditioncontainer>
<actioncontainer id="t102" x="-4795.0" y="892.5">Lautstärken setzen param_notifivolume</actioncontainer>
<conditioncontainer id="t103" x="-4795.0" y="-122.50003">Expression: setNotifiVolume"</conditioncontainer>
<conditioncontainer id="t104" x="-4585.0" y="-122.50003">Expression: Clear Automagic Meldungen"</conditioncontainer>
<conditioncontainer id="t105" x="-3745.0" y="-122.50003">Expression: notifysnd"</conditioncontainer>
<actioncontainer id="t106" x="-3885.0" y="-297.5">NotificationLautstärke auf Level 7</actioncontainer>
<actioncontainer id="t107" x="-3885.0" y="-472.49988">Notification Lautstärke Speichern</actioncontainer>
<conditioncontainer id="t108" x="-3885.0" y="-647.5">Expression: param_notifyfile == "RedAlert.mp3"</conditioncontainer>
<actioncontainer id="t109" x="-3745.0" y="1067.5">Notification Lautstärke Wiederherstellen</actioncontainer>
<conditioncontainer id="t82" x="1295.0" y="577.5">Expression: param_orientation == "portrait"</conditioncontainer>
<actioncontainer id="t83" x="2975.0" y="892.5">Setze Lock PIN/Passwort: PIN/Passwort zurücksetzen</actioncontainer>
<conditioncontainer id="t84" x="2870.0" y="577.5">Expression: param_lockmod == "on"</conditioncontainer>
<conditioncontainer id="t85" x="2870.0" y="-122.5">Expression: setScreenlock"</conditioncontainer>
<actioncontainer id="t86" x="2765.0" y="892.5">Setze Lock PIN/Passwort: Setze PIN von Variable param_lockpin</actioncontainer>
<conditioncontainer id="t87" x="-3115.0" y="367.5">Expression: Reboot</conditioncontainer>
<conditioncontainer id="t88" x="-3325.0" y="-122.5">Expression: System Command"</conditioncontainer>
<actioncontainer id="t89" x="-3115.0" y="892.5">Neustart </actioncontainer>
<conditioncontainer id="t90" x="-3325.0" y="367.5">Expression: Shutdown</conditioncontainer>
<conditioncontainer id="t91" x="-3535.0" y="367.5">Expression: Airplanemode</conditioncontainer>
<actioncontainer id="t92" x="-3325.0" y="892.5">Herunterfahren</actioncontainer>
<actioncontainer id="t93" x="-3535.0" y="892.5">Flugmodus ein-/ausschalten: Ein</actioncontainer>
<actioncontainer id="t94" x="-3745.0" y="892.5">Sound: /storage/emulated/0/Notifications/{param_notifyfile} als Benachrichtigung</actioncontainer>
<actioncontainer id="t95" x="-3955.0" y="892.5">Benachrichtigung aus Statusbar entfernen: Alle</actioncontainer>
<actioncontainer id="t96" x="-4165.0" y="892.5">Benachrichtigung aus Statusbar entfernen: Alle (Automagic)</actioncontainer>
<conditioncontainer id="t97" x="-4165.0" y="367.5">Expression: Automagic</conditioncontainer>
<conditioncontainer id="t98" x="-3955.0" y="367.5">Expression: All</conditioncontainer>
<actioncontainer id="t99" x="-4795.0" y="892.5">Lautstärken setzen param_notifivolume</actioncontainer>
<conditioncontainer id="t100" x="-4795.0" y="-122.5">Expression: setNotifiVolume"</conditioncontainer>
<conditioncontainer id="t101" x="-4585.0" y="-122.5">Expression: Clear Automagic Meldungen"</conditioncontainer>
<conditioncontainer id="t102" x="-3745.0" y="-122.5">Expression: notifysnd"</conditioncontainer>
<actioncontainer id="t103" x="-3885.0" y="-297.5">NotificationLautstärke auf Level 7</actioncontainer>
<actioncontainer id="t104" x="-3885.0" y="-472.5">Notification Lautstärke Speichern</actioncontainer>
<conditioncontainer id="t105" x="-3885.0" y="-647.5">Expression: param_notifyfile == "RedAlert.mp3"</conditioncontainer>
<actioncontainer id="t106" x="-3745.0" y="1067.5">Notification Lautstärke Wiederherstellen</actioncontainer>
<conditioncontainer id="t107" x="2555.0" y="-122.5">Expression: setVoiceCommand"</conditioncontainer>
<actioncontainer id="t108" x="2555.0" y="892.5">Flows ausführen: VoiceControl</actioncontainer>
<conditioncontainer id="t109" x="-5005.0" y="-122.500015">Expression: setVibrate"</conditioncontainer>
<actioncontainer id="t110" x="-5005.0" y="892.5">Vibrieren: Pattern 2 (-- --)</actioncontainer>
<conditioncontainer id="t111" x="-805.0" y="-2047.5">Expression: trigger == "HTTP Request: /fhem-amad/setCommands/*"</conditioncontainer>
<connection from="t1" to="t81" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t2" to="t41" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t3" to="t40" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
@ -1512,7 +1688,7 @@ FHEMCMD: statusrequest</customHTTPHeaders>
<connection from="t42" to="t75" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t43" to="t75" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t44" to="t75" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t45" to="t84" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t45" to="t82" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t45" to="t12" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t45" to="t9" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t46" to="t14" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
@ -1550,53 +1726,55 @@ FHEMCMD: statusrequest</customHTTPHeaders>
<connection from="t77" to="t75" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t79" to="t80" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t80" to="t75" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t81" to="t88" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t81" to="t82" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t82" to="t83" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t84" to="t10" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t86" to="t89" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t86" to="t85" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t87" to="t86" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t91" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t53" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t79" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t22" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t39" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t3" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t4" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t5" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t71" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t19" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t8" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t45" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t38" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t48" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t105" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t70" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t104" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t82" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t103" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t81" to="t111" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t81" to="t107" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t82" to="t10" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t84" to="t86" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t84" to="t83" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t85" to="t84" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t87" to="t89" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t87" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t90" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t88" to="t91" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t90" to="t92" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t91" to="t90" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t91" to="t93" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t91" to="t94" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t93" to="t95" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t94" to="t96" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t97" to="t109" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t98" to="t75" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t94" to="t106" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t95" to="t75" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t96" to="t75" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t97" to="t96" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t98" to="t95" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t99" to="t75" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t100" to="t99" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t101" to="t98" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t102" to="t75" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t103" to="t102" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t104" to="t101" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t104" to="t100" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t105" to="t108" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t106" to="t97" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t107" to="t106" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t108" to="t107" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t108" to="t97" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t101" to="t97" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t102" to="t105" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t103" to="t94" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t104" to="t103" type="NORMAL" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t105" to="t104" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t105" to="t94" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t107" to="t108" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t109" to="t110" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t88" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t53" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t79" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t22" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t39" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t3" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t4" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t5" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t71" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t19" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t8" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t45" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t38" type="FALSE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t48" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t102" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t70" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t101" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t107" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t100" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t85" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
<connection from="t111" to="t109" type="TRUE" sourcePosition="SOUTH" targetPosition="NORTH" />
</flow>
<flow type="flow">
<name>VoiceControl</name>